From: Wafer Xie Date: Wed, 19 Nov 2025 13:24:52 +0000 (+0800) Subject: vdpa: fix vhost-vdpa suspended state not be shared X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fd3a2c601ab4a1bdb669e4c584b364e00a978702;p=thirdparty%2Fqemu.git vdpa: fix vhost-vdpa suspended state not be shared 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> --- 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;