Message ID | 20221104095700.4117433-4-eesposit@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Still more coroutine and various fixes in block layer | expand |
On 11/4/22 12:56, Emanuele Giuseppe Esposito wrote: > These functions end up calling bdrv_*() implemented as generated_co_wrapper > functions. Same here. Sorry that I joined only on v3. In past we had a lot of "coroutine wrappers", each IO function in block/io.c and many in block.c had two variants: coroutine_fn bdrv_co_foo(...) and a wrapper bdrv_foo(...) And that wrapper is not a coroutine_fn, it's for calling from any context: coroutine or not. Now many of these wrappers are auto-generated, you may find them in build/block/block-gen.c after successful make. "generated_co_wrapper" is a sign for code generation script to generate the wrapper code. > In addition, they also happen to be always called in coroutine context, > meaning all callers are coroutine_fn. > This means that the g_c_w function will enter the qemu_in_coroutine() > case and eventually suspend (or in other words call qemu_coroutine_yield()). > Therefore we need to mark such functions coroutine_fn too. > > Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com> > --- > nbd/server.c | 21 ++++++++++++--------- > 1 file changed, 12 insertions(+), 9 deletions(-) > > diff --git a/nbd/server.c b/nbd/server.c > index ada16089f3..e2eec0cf46 100644 > --- a/nbd/server.c > +++ b/nbd/server.c > @@ -2141,8 +2141,9 @@ static int nbd_extent_array_add(NBDExtentArray *ea, > return 0; > } > > -static int blockstatus_to_extents(BlockDriverState *bs, uint64_t offset, > - uint64_t bytes, NBDExtentArray *ea) > +static int coroutine_fn blockstatus_to_extents(BlockDriverState *bs, > + uint64_t offset, uint64_t bytes, > + NBDExtentArray *ea) > { > while (bytes) { > uint32_t flags; > @@ -2168,8 +2169,9 @@ static int blockstatus_to_extents(BlockDriverState *bs, uint64_t offset, > return 0; > } > > -static int blockalloc_to_extents(BlockDriverState *bs, uint64_t offset, > - uint64_t bytes, NBDExtentArray *ea) > +static int coroutine_fn blockalloc_to_extents(BlockDriverState *bs, > + uint64_t offset, uint64_t bytes, > + NBDExtentArray *ea) > { > while (bytes) { > int64_t num; > @@ -2220,11 +2222,12 @@ static int nbd_co_send_extents(NBDClient *client, uint64_t handle, > } > > /* Get block status from the exported device and send it to the client */ > -static int nbd_co_send_block_status(NBDClient *client, uint64_t handle, > - BlockDriverState *bs, uint64_t offset, > - uint32_t length, bool dont_fragment, > - bool last, uint32_t context_id, > - Error **errp) > +static int > +coroutine_fn nbd_co_send_block_status(NBDClient *client, uint64_t handle, > + BlockDriverState *bs, uint64_t offset, > + uint32_t length, bool dont_fragment, > + bool last, uint32_t context_id, > + Error **errp) > { > int ret; > unsigned int nb_extents = dont_fragment ? 1 : NBD_MAX_BLOCK_STATUS_EXTENTS;
diff --git a/nbd/server.c b/nbd/server.c index ada16089f3..e2eec0cf46 100644 --- a/nbd/server.c +++ b/nbd/server.c @@ -2141,8 +2141,9 @@ static int nbd_extent_array_add(NBDExtentArray *ea, return 0; } -static int blockstatus_to_extents(BlockDriverState *bs, uint64_t offset, - uint64_t bytes, NBDExtentArray *ea) +static int coroutine_fn blockstatus_to_extents(BlockDriverState *bs, + uint64_t offset, uint64_t bytes, + NBDExtentArray *ea) { while (bytes) { uint32_t flags; @@ -2168,8 +2169,9 @@ static int blockstatus_to_extents(BlockDriverState *bs, uint64_t offset, return 0; } -static int blockalloc_to_extents(BlockDriverState *bs, uint64_t offset, - uint64_t bytes, NBDExtentArray *ea) +static int coroutine_fn blockalloc_to_extents(BlockDriverState *bs, + uint64_t offset, uint64_t bytes, + NBDExtentArray *ea) { while (bytes) { int64_t num; @@ -2220,11 +2222,12 @@ static int nbd_co_send_extents(NBDClient *client, uint64_t handle, } /* Get block status from the exported device and send it to the client */ -static int nbd_co_send_block_status(NBDClient *client, uint64_t handle, - BlockDriverState *bs, uint64_t offset, - uint32_t length, bool dont_fragment, - bool last, uint32_t context_id, - Error **errp) +static int +coroutine_fn nbd_co_send_block_status(NBDClient *client, uint64_t handle, + BlockDriverState *bs, uint64_t offset, + uint32_t length, bool dont_fragment, + bool last, uint32_t context_id, + Error **errp) { int ret; unsigned int nb_extents = dont_fragment ? 1 : NBD_MAX_BLOCK_STATUS_EXTENTS;
These functions end up calling bdrv_*() implemented as generated_co_wrapper functions. In addition, they also happen to be always called in coroutine context, meaning all callers are coroutine_fn. This means that the g_c_w function will enter the qemu_in_coroutine() case and eventually suspend (or in other words call qemu_coroutine_yield()). Therefore we need to mark such functions coroutine_fn too. Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com> --- nbd/server.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-)