[PATCH] hw/virtio: Propagate vhost_virtqueue_mask errors
Xiong Weimin <[email protected]> Fri, 7 Aug 2026 10:43:59 +0800
| Newsgroups | dev.linux.lists.virtualization,org.nongnu.qemu-devel |
|---|---|
| Message-ID | <[email protected]> |
vhost_virtqueue_mask() currently reports failures from vhost_set_vring_call() but always returns void, so callers cannot react. In particular, vhost_virtqueue_start() has a TODO next to the unmask call when !use_guest_notifier_mask. Make vhost_virtqueue_mask() return the underlying errno, and on failure in vhost_virtqueue_start() jump to the existing fail path which unmaps the vring and propagates the error to the device start caller. Other call sites keep today's behavior by ignoring the return value. Signed-off-by: Xiong Weimin <[email protected]> --- hw/virtio/vhost.c | 10 +++++++--- include/hw/virtio/vhost.h | 9 ++++++--- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c index af41841b52..b02d831d3a 100644 --- a/hw/virtio/vhost.c +++ b/hw/virtio/vhost.c @@ -1470,8 +1470,10 @@ int vhost_virtqueue_start(struct vhost_dev *dev, * will do it later. */ if (!vdev->use_guest_notifier_mask) { - /* TODO: check and handle errors. */ - vhost_virtqueue_mask(dev, vdev, idx, false); + r = vhost_virtqueue_mask(dev, vdev, idx, false); + if (r < 0) { + goto fail; + } } if (k->query_guest_notifiers && @@ -1918,7 +1920,7 @@ bool vhost_virtqueue_pending(struct vhost_dev *hdev, int n) } /* Mask/unmask events from this vq. */ -void vhost_virtqueue_mask(struct vhost_dev *hdev, VirtIODevice *vdev, int n, +int vhost_virtqueue_mask(struct vhost_dev *hdev, VirtIODevice *vdev, int n, bool mask) { struct VirtQueue *vvq = virtio_get_queue(vdev, n); @@ -1939,7 +1941,9 @@ void vhost_virtqueue_mask(struct vhost_dev *hdev, VirtIODevice *vdev, int n, r = hdev->vhost_ops->vhost_set_vring_call(hdev, &file); if (r < 0) { error_report("vhost_set_vring_call failed %d", -r); + return r; } + return 0; } bool vhost_config_pending(struct vhost_dev *hdev) diff --git a/include/hw/virtio/vhost.h b/include/hw/virtio/vhost.h index 684bafcaad..3db56433b6 100644 --- a/include/hw/virtio/vhost.h +++ b/include/hw/virtio/vhost.h @@ -310,10 +310,13 @@ void vhost_dev_set_config_notifier(struct vhost_dev *dev, */ bool vhost_virtqueue_pending(struct vhost_dev *hdev, int n); -/* Mask/unmask events from this vq. +/** + * vhost_virtqueue_mask(): mask/unmask events from this vq. + * + * Returns: 0 on success, a negative errno on failure. */ -void vhost_virtqueue_mask(struct vhost_dev *hdev, VirtIODevice *vdev, int n, - bool mask); +int vhost_virtqueue_mask(struct vhost_dev *hdev, VirtIODevice *vdev, int n, + bool mask); /** * vhost_get_features_ex() - sanitize the extended features set