From ad2c2ef5e57f8c67e935c406801693a9bbc2e629 Mon Sep 17 00:00:00 2001 From: Wafer Xie Date: Wed, 19 Nov 2025 21:24:52 +0800 Subject: [PATCH] vdpa: fix vhost-vdpa suspended state not be shared MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When stopping a vhost-vdpa device, only the first queue pair is marked as suspended, while the remaining queues are not updated to the suspended state. As a result, when stopping a multi-queue vhost-vdpa device, the following error message will be printed. qemu-system-x86_64:vhost VQ 2 ring restore failed: -1: Operation not permitted (1) qemu-system-x86_64:vhost VQ 3 ring restore failed: -1: Operation not permitted (1) So move v->suspended to v->shared, and then all the vhost_vdpa devices cannot have different suspended states. Fixes: 0bb302a9960a ("vdpa: add vhost_vdpa_suspend") Suggested-by: Eugenio Pérez Acked-by: Eugenio Pérez Acked-by: Jason Wang Signed-off-by: Wafer Xie Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin Acked-by: Jason Wang Message-Id: <20251119132452.3117-1-wafer@jaguarmicro.com> (cherry picked from commit fd3a2c601ab4a1bdb669e4c584b364e00a978702) Signed-off-by: Michael Tokarev --- hw/virtio/vhost-vdpa.c | 6 +++--- include/hw/virtio/vhost-vdpa.h | 8 ++++++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/hw/virtio/vhost-vdpa.c b/hw/virtio/vhost-vdpa.c index 7061b6e1a3..2f8f11df86 100644 --- a/hw/virtio/vhost-vdpa.c +++ b/hw/virtio/vhost-vdpa.c @@ -905,7 +905,7 @@ static int vhost_vdpa_reset_device(struct vhost_dev *dev) memory_listener_unregister(&v->shared->listener); v->shared->listener_registered = false; - v->suspended = false; + v->shared->suspended = false; return 0; } @@ -1354,7 +1354,7 @@ static void vhost_vdpa_suspend(struct vhost_dev *dev) if (unlikely(r)) { error_report("Cannot suspend: %s(%d)", g_strerror(errno), errno); } else { - v->suspended = true; + v->shared->suspended = true; return; } } @@ -1481,7 +1481,7 @@ static int vhost_vdpa_get_vring_base(struct vhost_dev *dev, return 0; } - if (!v->suspended) { + if (!v->shared->suspended) { /* * Cannot trust in value returned by device, let vhost recover used * idx from guest. diff --git a/include/hw/virtio/vhost-vdpa.h b/include/hw/virtio/vhost-vdpa.h index 449bf5c840..80ff670e23 100644 --- a/include/hw/virtio/vhost-vdpa.h +++ b/include/hw/virtio/vhost-vdpa.h @@ -76,6 +76,12 @@ typedef struct vhost_vdpa_shared { /* SVQ switching is in progress, or already completed? */ SVQTransitionState svq_switching; + + /* + * Device suspended successfully. + * The vhost_vdpa devices cannot have different suspended states. + */ + bool suspended; } VhostVDPAShared; typedef struct vhost_vdpa { @@ -83,8 +89,6 @@ typedef struct vhost_vdpa { uint32_t address_space_id; uint64_t acked_features; bool shadow_vqs_enabled; - /* Device suspended successfully */ - bool suspended; VhostVDPAShared *shared; GPtrArray *shadow_vqs; const VhostShadowVirtqueueOps *shadow_vq_ops;