On Fri, Jul 31, 2026 at 06:46:22PM +0200, Laurent Vivier wrote:
vu_cleanup() resets most virtqueue state (started, notification, file descriptors) but does not reset the enable flag. After a QEMU disconnect and reconnect, the stale enable flag causes vu_set_vring_enable_exec() to hit its early return check (vq->enable == enable), skipping the threading_start_thread() call and leaving the worker thread stopped.
Reset vq->enable to false in vu_cleanup() alongside the other virtqueue state.
Signed-off-by: Laurent Vivier
Reviewed-by: David Gibson
--- vhost_user.c | 1 + 1 file changed, 1 insertion(+)
diff --git a/vhost_user.c b/vhost_user.c index 9e382c21f963..8ba3949e4e9d 100644 --- a/vhost_user.c +++ b/vhost_user.c @@ -1083,6 +1083,7 @@ void vu_cleanup(struct vu_dev *vdev) struct vu_virtq *vq = &vdev->vq[i];
vq->started = false; + vq->enable = false; vq->notification = true;
if (vq->call_fd != -1) { -- 2.54.0
-- David Gibson (he or they) | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you, not the other way | around. http://www.ozlabs.org/~dgibson