[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v4 07/20] block/export: stop using is_external in vhost-user-
From: |
Kevin Wolf |
Subject: |
Re: [PATCH v4 07/20] block/export: stop using is_external in vhost-user-blk server |
Date: |
Tue, 2 May 2023 18:04:24 +0200 |
Am 25.04.2023 um 19:27 hat Stefan Hajnoczi geschrieben:
> vhost-user activity must be suspended during bdrv_drained_begin/end().
> This prevents new requests from interfering with whatever is happening
> in the drained section.
>
> Previously this was done using aio_set_fd_handler()'s is_external
> argument. In a multi-queue block layer world the aio_disable_external()
> API cannot be used since multiple AioContext may be processing I/O, not
> just one.
>
> Switch to BlockDevOps->drained_begin/end() callbacks.
>
> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
> ---
> block/export/vhost-user-blk-server.c | 43 ++++++++++++++--------------
> util/vhost-user-server.c | 10 +++----
> 2 files changed, 26 insertions(+), 27 deletions(-)
>
> diff --git a/block/export/vhost-user-blk-server.c
> b/block/export/vhost-user-blk-server.c
> index 092b86aae4..d20f69cd74 100644
> --- a/block/export/vhost-user-blk-server.c
> +++ b/block/export/vhost-user-blk-server.c
> @@ -208,22 +208,6 @@ static const VuDevIface vu_blk_iface = {
> .process_msg = vu_blk_process_msg,
> };
>
> -static void blk_aio_attached(AioContext *ctx, void *opaque)
> -{
> - VuBlkExport *vexp = opaque;
> -
> - vexp->export.ctx = ctx;
> - vhost_user_server_attach_aio_context(&vexp->vu_server, ctx);
> -}
> -
> -static void blk_aio_detach(void *opaque)
> -{
> - VuBlkExport *vexp = opaque;
> -
> - vhost_user_server_detach_aio_context(&vexp->vu_server);
> - vexp->export.ctx = NULL;
> -}
So for changing the AioContext, we now rely on the fact that the node to
be changed is always drained, so the drain callbacks implicitly cover
this case, too?
> static void
> vu_blk_initialize_config(BlockDriverState *bs,
> struct virtio_blk_config *config,
> @@ -272,6 +256,25 @@ static void vu_blk_exp_resize(void *opaque)
> vu_config_change_msg(&vexp->vu_server.vu_dev);
> }
>
> +/* Called with vexp->export.ctx acquired */
> +static void vu_blk_drained_begin(void *opaque)
> +{
> + VuBlkExport *vexp = opaque;
> +
> + vhost_user_server_detach_aio_context(&vexp->vu_server);
> +}
Compared to the old code, we're losing the vexp->export.ctx = NULL. This
is correct at this point because after drained_begin we still keep
processing requests until we arrive at a quiescent state.
However, if we detach the AioContext because we're deleting the
iothread, won't we end up with a dangling pointer in vexp->export.ctx?
Or can we be certain that nothing interesting happens before drained_end
updates it with a new valid pointer again?
Kevin
- Re: [PATCH v4 07/20] block/export: stop using is_external in vhost-user-blk server,
Kevin Wolf <=