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;
--
Best regards,
Vladimir