[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-blk server
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@xxxxxxxxxx> > --- > 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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |