Re: [PATCH v2] hw/virtio: propagate vhost_virtqueue_mask() errors from start path

Philippe Mathieu-Daudé <[email protected]> Mon, 3 Aug 2026 09:09:41 +0200
Newsgroups org.nongnu.qemu-devel
Message-ID <[email protected]>
Hi,

On 16/7/26 05:33, Bin Guo wrote:
> vhost_virtqueue_start() unmasks the call notifier by calling
> vhost_virtqueue_mask(), whose vhost_set_vring_call ioctl can fail
> (closed vhost-user socket, kernel ENOMEM, revoked guest_notifier fd)
> but whose void signature throws the error away. vhost_dev_start()
> then reports success while the backend has no valid call eventfd for
> that vq, leaving the guest with a working kick path but no virtqueue
> interrupts -- a half-up state harder to diagnose than a clean failure.
> 
> Make vhost_virtqueue_mask() return int and handle the error in the
> start path via the existing fail unwind. Other callers reach the
> function through VirtioDeviceClass.guest_notifier_mask, whose void
> signature offers no upward error channel; they invoke it as a
> statement and remain unchanged.
> 
> Signed-off-by: Bin Guo <[email protected]>
> ---
>   hw/virtio/vhost.c         | 9 ++++++---
>   include/hw/virtio/vhost.h | 2 +-
>   2 files changed, 7 insertions(+), 4 deletions(-)


> diff --git a/include/hw/virtio/vhost.h b/include/hw/virtio/vhost.h
> index 684bafcaad..1f62332d60 100644
> --- a/include/hw/virtio/vhost.h
> +++ b/include/hw/virtio/vhost.h
> @@ -312,7 +312,7 @@ bool vhost_virtqueue_pending(struct vhost_dev *hdev, int n);
>   
>   /* Mask/unmask events from this vq.

Please document the new returned value, i.e.:

   " * Return 0 on success, negative errno on failure."

(Good opportunity to convert to a proper docstring describing arguments)

>    */
> -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);
>   
>   /**