mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-09 02:24:58 -06:00
block/export: stop using is_external in vhost-user-blk server
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> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Message-Id: <20230516190238.8401-8-stefanha@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
8f5e9a8ee1
commit
e1054cd4aa
2 changed files with 31 additions and 7 deletions
|
@ -212,15 +212,21 @@ static void blk_aio_attached(AioContext *ctx, void *opaque)
|
|||
{
|
||||
VuBlkExport *vexp = opaque;
|
||||
|
||||
/*
|
||||
* The actual attach will happen in vu_blk_drained_end() and we just
|
||||
* restore ctx here.
|
||||
*/
|
||||
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);
|
||||
/*
|
||||
* The actual detach already happened in vu_blk_drained_begin() but from
|
||||
* this point on we must not access ctx anymore.
|
||||
*/
|
||||
vexp->export.ctx = NULL;
|
||||
}
|
||||
|
||||
|
@ -272,6 +278,22 @@ 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);
|
||||
}
|
||||
|
||||
/* Called with vexp->export.blk AioContext acquired */
|
||||
static void vu_blk_drained_end(void *opaque)
|
||||
{
|
||||
VuBlkExport *vexp = opaque;
|
||||
|
||||
vhost_user_server_attach_aio_context(&vexp->vu_server, vexp->export.ctx);
|
||||
}
|
||||
|
||||
/*
|
||||
* Ensures that bdrv_drained_begin() waits until in-flight requests complete.
|
||||
*
|
||||
|
@ -285,6 +307,8 @@ static bool vu_blk_drained_poll(void *opaque)
|
|||
}
|
||||
|
||||
static const BlockDevOps vu_blk_dev_ops = {
|
||||
.drained_begin = vu_blk_drained_begin,
|
||||
.drained_end = vu_blk_drained_end,
|
||||
.drained_poll = vu_blk_drained_poll,
|
||||
.resize_cb = vu_blk_exp_resize,
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue