In order to support configure interrupt. we will use queue number -1 as configure interrupt since all these device are not support the configure interrupt So we will add an check here, if the idx is -1, the function will return;
Signed-off-by: Cindy Lu <l...@redhat.com> --- hw/display/vhost-user-gpu.c | 8 ++++++-- hw/net/virtio-net.c | 10 +++++++--- hw/virtio/vhost-user-fs.c | 11 +++++++---- hw/virtio/vhost-vsock-common.c | 8 ++++++-- hw/virtio/virtio-crypto.c | 8 ++++++-- 5 files changed, 32 insertions(+), 13 deletions(-) diff --git a/hw/display/vhost-user-gpu.c b/hw/display/vhost-user-gpu.c index 51f1747c4a..d8e26cedf1 100644 --- a/hw/display/vhost-user-gpu.c +++ b/hw/display/vhost-user-gpu.c @@ -490,7 +490,9 @@ static bool vhost_user_gpu_guest_notifier_pending(VirtIODevice *vdev, int idx) { VhostUserGPU *g = VHOST_USER_GPU(vdev); - + if (idx == -1) { + return false; + } return vhost_virtqueue_pending(&g->vhost->dev, idx); } @@ -498,7 +500,9 @@ static void vhost_user_gpu_guest_notifier_mask(VirtIODevice *vdev, int idx, bool mask) { VhostUserGPU *g = VHOST_USER_GPU(vdev); - + if (idx == -1) { + return; + } vhost_virtqueue_mask(&g->vhost->dev, vdev, idx, mask); } diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index 9179013ac4..78ccaa228c 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -3060,7 +3060,10 @@ static bool virtio_net_guest_notifier_pending(VirtIODevice *vdev, int idx) VirtIONet *n = VIRTIO_NET(vdev); NetClientState *nc = qemu_get_subqueue(n->nic, vq2q(idx)); assert(n->vhost_started); - return vhost_net_virtqueue_pending(get_vhost_net(nc->peer), idx); + if (idx != -1) { + return vhost_net_virtqueue_pending(get_vhost_net(nc->peer), idx); + } + return false; } static void virtio_net_guest_notifier_mask(VirtIODevice *vdev, int idx, @@ -3069,8 +3072,9 @@ static void virtio_net_guest_notifier_mask(VirtIODevice *vdev, int idx, VirtIONet *n = VIRTIO_NET(vdev); NetClientState *nc = qemu_get_subqueue(n->nic, vq2q(idx)); assert(n->vhost_started); - vhost_net_virtqueue_mask(get_vhost_net(nc->peer), - vdev, idx, mask); + if (idx != -1) { + vhost_net_virtqueue_mask(get_vhost_net(nc->peer), vdev, idx, mask); + } } static void virtio_net_set_config_size(VirtIONet *n, uint64_t host_features) diff --git a/hw/virtio/vhost-user-fs.c b/hw/virtio/vhost-user-fs.c index 1bc5d03a00..37424c2193 100644 --- a/hw/virtio/vhost-user-fs.c +++ b/hw/virtio/vhost-user-fs.c @@ -142,18 +142,21 @@ static void vuf_handle_output(VirtIODevice *vdev, VirtQueue *vq) */ } -static void vuf_guest_notifier_mask(VirtIODevice *vdev, int idx, - bool mask) +static void vuf_guest_notifier_mask(VirtIODevice *vdev, int idx, bool mask) { VHostUserFS *fs = VHOST_USER_FS(vdev); - + if (idx == -1) { + return; + } vhost_virtqueue_mask(&fs->vhost_dev, vdev, idx, mask); } static bool vuf_guest_notifier_pending(VirtIODevice *vdev, int idx) { VHostUserFS *fs = VHOST_USER_FS(vdev); - + if (idx == -1) { + return false; + } return vhost_virtqueue_pending(&fs->vhost_dev, idx); } diff --git a/hw/virtio/vhost-vsock-common.c b/hw/virtio/vhost-vsock-common.c index 5b2ebf3496..0adf823d37 100644 --- a/hw/virtio/vhost-vsock-common.c +++ b/hw/virtio/vhost-vsock-common.c @@ -100,7 +100,9 @@ static void vhost_vsock_common_guest_notifier_mask(VirtIODevice *vdev, int idx, bool mask) { VHostVSockCommon *vvc = VHOST_VSOCK_COMMON(vdev); - + if (idx == -1) { + return; + } vhost_virtqueue_mask(&vvc->vhost_dev, vdev, idx, mask); } @@ -108,7 +110,9 @@ static bool vhost_vsock_common_guest_notifier_pending(VirtIODevice *vdev, int idx) { VHostVSockCommon *vvc = VHOST_VSOCK_COMMON(vdev); - + if (idx == -1) { + return false; + } return vhost_virtqueue_pending(&vvc->vhost_dev, idx); } diff --git a/hw/virtio/virtio-crypto.c b/hw/virtio/virtio-crypto.c index 54f9bbb789..c47f4ffb24 100644 --- a/hw/virtio/virtio-crypto.c +++ b/hw/virtio/virtio-crypto.c @@ -947,7 +947,9 @@ static void virtio_crypto_guest_notifier_mask(VirtIODevice *vdev, int idx, int queue = virtio_crypto_vq2q(idx); assert(vcrypto->vhost_started); - + if (idx == -1) { + return; + } cryptodev_vhost_virtqueue_mask(vdev, queue, idx, mask); } @@ -957,7 +959,9 @@ static bool virtio_crypto_guest_notifier_pending(VirtIODevice *vdev, int idx) int queue = virtio_crypto_vq2q(idx); assert(vcrypto->vhost_started); - + if (idx == -1) { + return false; + } return cryptodev_vhost_virtqueue_pending(vdev, queue, idx); } -- 2.21.3