Message ID | 20221123114227.85757-13-eesposit@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Still more coroutine and various fixes in block layer | expand |
Am 23.11.2022 um 12:42 hat Emanuele Giuseppe Esposito geschrieben: > Right now, we take the first parameter of the function to get the > BlockDriverState to pass to bdrv_poll_co(), that internally calls > functions that figure in which aiocontext the coroutine should run. > > However, it is useless to pass a bs just to get its own AioContext, > so instead pass it directly, and default to the main loop if no > BlockDriverState is passed as parameter. > > Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com> Patch 10 and 11 have the same subject line. Did you intend them to be squashed together? > diff --git a/scripts/block-coroutine-wrapper.py b/scripts/block-coroutine-wrapper.py > index 7e8f2da84b..1d552cb734 100644 > --- a/scripts/block-coroutine-wrapper.py > +++ b/scripts/block-coroutine-wrapper.py > @@ -78,14 +78,14 @@ def __init__(self, return_type: str, name: str, args: str, > > t = self.args[0].type > if t == 'BlockDriverState *': > - bs = 'bs' > + ctx = 'bdrv_get_aio_context(bs)' > elif t == 'BdrvChild *': > - bs = 'child->bs' > + ctx = 'bdrv_get_aio_context(child->bs)' > elif t == 'BlockBackend *': > - bs = 'blk_bs(blk)' > + ctx = 'bdrv_get_aio_context(blk_bs(blk))' This should use blk_get_aio_context(). If a BlockBackend has no root attached, i.e. blk_bs(blk) == NULL, it can still be in a non-mainloop AioContext. Kevin
diff --git a/block/block-gen.h b/block/block-gen.h index f80cf4897d..08d977f493 100644 --- a/block/block-gen.h +++ b/block/block-gen.h @@ -30,7 +30,7 @@ /* Base structure for argument packing structures */ typedef struct BdrvPollCo { - BlockDriverState *bs; + AioContext *ctx; bool in_progress; int ret; Coroutine *co; /* Keep pointer here for debugging */ @@ -40,8 +40,8 @@ static inline int bdrv_poll_co(BdrvPollCo *s) { assert(!qemu_in_coroutine()); - bdrv_coroutine_enter(s->bs, s->co); - BDRV_POLL_WHILE(s->bs, s->in_progress); + aio_co_enter(s->ctx, s->co); + AIO_WAIT_WHILE(s->ctx, s->in_progress); return s->ret; } diff --git a/scripts/block-coroutine-wrapper.py b/scripts/block-coroutine-wrapper.py index 7e8f2da84b..1d552cb734 100644 --- a/scripts/block-coroutine-wrapper.py +++ b/scripts/block-coroutine-wrapper.py @@ -78,14 +78,14 @@ def __init__(self, return_type: str, name: str, args: str, t = self.args[0].type if t == 'BlockDriverState *': - bs = 'bs' + ctx = 'bdrv_get_aio_context(bs)' elif t == 'BdrvChild *': - bs = 'child->bs' + ctx = 'bdrv_get_aio_context(child->bs)' elif t == 'BlockBackend *': - bs = 'blk_bs(blk)' + ctx = 'bdrv_get_aio_context(blk_bs(blk))' else: - bs = 'NULL' - self.bs = bs + ctx = 'qemu_get_aio_context()' + self.ctx = ctx def gen_list(self, format: str) -> str: return ', '.join(format.format_map(arg.__dict__) for arg in self.args) @@ -130,7 +130,7 @@ def create_g_c_w(func: FuncDecl) -> str: return {name}({ func.gen_list('{name}') }); }} else {{ {struct_name} s = {{ - .poll_state.bs = {func.bs}, + .poll_state.ctx = {func.ctx}, .poll_state.in_progress = true, { func.gen_block(' .{name} = {name},') } @@ -151,7 +151,7 @@ def create_coroutine_only(func: FuncDecl) -> str: int {func.name}({ func.gen_list('{decl}') }) {{ {struct_name} s = {{ - .poll_state.bs = {func.bs}, + .poll_state.ctx = {func.ctx}, .poll_state.in_progress = true, { func.gen_block(' .{name} = {name},') }
Right now, we take the first parameter of the function to get the BlockDriverState to pass to bdrv_poll_co(), that internally calls functions that figure in which aiocontext the coroutine should run. However, it is useless to pass a bs just to get its own AioContext, so instead pass it directly, and default to the main loop if no BlockDriverState is passed as parameter. Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com> --- block/block-gen.h | 6 +++--- scripts/block-coroutine-wrapper.py | 14 +++++++------- 2 files changed, 10 insertions(+), 10 deletions(-)