mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-21 09:02:00 -06:00
block/export: Fix vhost-user-blk shutdown with requests in flight
The vhost-user-blk export runs requests asynchronously in their own coroutine. When the vhost connection goes away and we want to stop the vhost-user server, we need to wait for these coroutines to stop before we can unmap the shared memory. Otherwise, they would still access the unmapped memory and crash. This introduces a refcount to VuServer which is increased when spawning a new request coroutine and decreased before the coroutine exits. The memory is only unmapped when the refcount reaches zero. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Message-Id: <20220125151435.48792-1-kwolf@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
c0829cb1fd
commit
520d8b40e8
3 changed files with 32 additions and 0 deletions
|
@ -42,6 +42,8 @@ typedef struct {
|
|||
const VuDevIface *vu_iface;
|
||||
|
||||
/* Protected by ctx lock */
|
||||
unsigned int refcount;
|
||||
bool wait_idle;
|
||||
VuDev vu_dev;
|
||||
QIOChannel *ioc; /* The I/O channel with the client */
|
||||
QIOChannelSocket *sioc; /* The underlying data channel with the client */
|
||||
|
@ -59,6 +61,9 @@ bool vhost_user_server_start(VuServer *server,
|
|||
|
||||
void vhost_user_server_stop(VuServer *server);
|
||||
|
||||
void vhost_user_server_ref(VuServer *server);
|
||||
void vhost_user_server_unref(VuServer *server);
|
||||
|
||||
void vhost_user_server_attach_aio_context(VuServer *server, AioContext *ctx);
|
||||
void vhost_user_server_detach_aio_context(VuServer *server);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue