Message ID | 20220711155243.866530-2-lulu@redhat.com |
---|---|
State | New |
Headers | show |
Series | [v11,01/10] virtio: introduce macro IRTIO_CONFIG_IRQ_IDX | expand |
在 2022/7/11 23:52, Cindy Lu 写道: > To support configure interrupt for vhost-vdpa > Introduce VIRTIO_CONFIG_IRQ_IDX -1 as configure interrupt's queue index, > Then we can reuse the functions guest_notifier_mask and guest_notifier_pending. > Add the check of queue index in these drivers, if the driver does not support > configure interrupt, the function will just return > > Signed-off-by: Cindy Lu <lulu@redhat.com> A typo in the subject should be "VIRTIO_CONFIG_IRQ_IDX". > --- > hw/display/vhost-user-gpu.c | 6 ++++++ > hw/net/virtio-net.c | 10 ++++++++-- > hw/virtio/vhost-user-fs.c | 6 ++++++ > hw/virtio/vhost-vsock-common.c | 6 ++++++ > hw/virtio/virtio-crypto.c | 6 ++++++ > include/hw/virtio/virtio.h | 3 +++ > 6 files changed, 35 insertions(+), 2 deletions(-) > > diff --git a/hw/display/vhost-user-gpu.c b/hw/display/vhost-user-gpu.c > index 09818231bd..d4a440e815 100644 > --- a/hw/display/vhost-user-gpu.c > +++ b/hw/display/vhost-user-gpu.c > @@ -485,6 +485,9 @@ vhost_user_gpu_guest_notifier_pending(VirtIODevice *vdev, int idx) > { > VhostUserGPU *g = VHOST_USER_GPU(vdev); > > + if (idx == VIRTIO_CONFIG_IRQ_IDX) { > + return false; > + } I think we should either 1) explain why this check is needed or 2) defer this change to the patch that can actually hit this check Thanks > return vhost_virtqueue_pending(&g->vhost->dev, idx); > } > > @@ -493,6 +496,9 @@ vhost_user_gpu_guest_notifier_mask(VirtIODevice *vdev, int idx, bool mask) > { > VhostUserGPU *g = VHOST_USER_GPU(vdev); > > + if (idx == VIRTIO_CONFIG_IRQ_IDX) { > + 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 1067e72b39..72ea4819f7 100644 > --- a/hw/net/virtio-net.c > +++ b/hw/net/virtio-net.c > @@ -3172,6 +3172,9 @@ 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); > + if (idx == VIRTIO_CONFIG_IRQ_IDX) { > + return false; > + } > return vhost_net_virtqueue_pending(get_vhost_net(nc->peer), idx); > } > > @@ -3181,8 +3184,11 @@ 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 == VIRTIO_CONFIG_IRQ_IDX) { > + return; > + } > + > + 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 c595957983..9b0349922e 100644 > --- a/hw/virtio/vhost-user-fs.c > +++ b/hw/virtio/vhost-user-fs.c > @@ -161,6 +161,9 @@ static void vuf_guest_notifier_mask(VirtIODevice *vdev, int idx, > { > VHostUserFS *fs = VHOST_USER_FS(vdev); > > + if (idx == VIRTIO_CONFIG_IRQ_IDX) { > + return; > + } > vhost_virtqueue_mask(&fs->vhost_dev, vdev, idx, mask); > } > > @@ -168,6 +171,9 @@ static bool vuf_guest_notifier_pending(VirtIODevice *vdev, int idx) > { > VHostUserFS *fs = VHOST_USER_FS(vdev); > > + if (idx == VIRTIO_CONFIG_IRQ_IDX) { > + 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 ed706681ac..b1f0d46209 100644 > --- a/hw/virtio/vhost-vsock-common.c > +++ b/hw/virtio/vhost-vsock-common.c > @@ -125,6 +125,9 @@ static void vhost_vsock_common_guest_notifier_mask(VirtIODevice *vdev, int idx, > { > VHostVSockCommon *vvc = VHOST_VSOCK_COMMON(vdev); > > + if (idx == VIRTIO_CONFIG_IRQ_IDX) { > + return; > + } > vhost_virtqueue_mask(&vvc->vhost_dev, vdev, idx, mask); > } > > @@ -133,6 +136,9 @@ static bool vhost_vsock_common_guest_notifier_pending(VirtIODevice *vdev, > { > VHostVSockCommon *vvc = VHOST_VSOCK_COMMON(vdev); > > + if (idx == VIRTIO_CONFIG_IRQ_IDX) { > + 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 dcd80b904d..7085643d5f 100644 > --- a/hw/virtio/virtio-crypto.c > +++ b/hw/virtio/virtio-crypto.c > @@ -948,6 +948,9 @@ static void virtio_crypto_guest_notifier_mask(VirtIODevice *vdev, int idx, > > assert(vcrypto->vhost_started); > > + if (idx == VIRTIO_CONFIG_IRQ_IDX) { > + return; > + } > cryptodev_vhost_virtqueue_mask(vdev, queue, idx, mask); > } > > @@ -958,6 +961,9 @@ static bool virtio_crypto_guest_notifier_pending(VirtIODevice *vdev, int idx) > > assert(vcrypto->vhost_started); > > + if (idx == VIRTIO_CONFIG_IRQ_IDX) { > + return false; > + } > return cryptodev_vhost_virtqueue_pending(vdev, queue, idx); > } > > diff --git a/include/hw/virtio/virtio.h b/include/hw/virtio/virtio.h > index b31c4507f5..4512205503 100644 > --- a/include/hw/virtio/virtio.h > +++ b/include/hw/virtio/virtio.h > @@ -67,6 +67,9 @@ typedef struct VirtQueueElement > > #define VIRTIO_NO_VECTOR 0xffff > > +/* special index value used internally for config irqs */ > +#define VIRTIO_CONFIG_IRQ_IDX -1 > + > #define TYPE_VIRTIO_DEVICE "virtio-device" > OBJECT_DECLARE_TYPE(VirtIODevice, VirtioDeviceClass, VIRTIO_DEVICE) >
On Tue, Jul 19, 2022 at 4:58 PM Jason Wang <jasowang@redhat.com> wrote: > > > 在 2022/7/11 23:52, Cindy Lu 写道: > > To support configure interrupt for vhost-vdpa > > Introduce VIRTIO_CONFIG_IRQ_IDX -1 as configure interrupt's queue index, > > Then we can reuse the functions guest_notifier_mask and guest_notifier_pending. > > Add the check of queue index in these drivers, if the driver does not support > > configure interrupt, the function will just return > > > > Signed-off-by: Cindy Lu <lulu@redhat.com> > > > A typo in the subject should be "VIRTIO_CONFIG_IRQ_IDX". > sure ,will fix this > > > --- > > hw/display/vhost-user-gpu.c | 6 ++++++ > > hw/net/virtio-net.c | 10 ++++++++-- > > hw/virtio/vhost-user-fs.c | 6 ++++++ > > hw/virtio/vhost-vsock-common.c | 6 ++++++ > > hw/virtio/virtio-crypto.c | 6 ++++++ > > include/hw/virtio/virtio.h | 3 +++ > > 6 files changed, 35 insertions(+), 2 deletions(-) > > > > diff --git a/hw/display/vhost-user-gpu.c b/hw/display/vhost-user-gpu.c > > index 09818231bd..d4a440e815 100644 > > --- a/hw/display/vhost-user-gpu.c > > +++ b/hw/display/vhost-user-gpu.c > > @@ -485,6 +485,9 @@ vhost_user_gpu_guest_notifier_pending(VirtIODevice *vdev, int idx) > > { > > VhostUserGPU *g = VHOST_USER_GPU(vdev); > > > > + if (idx == VIRTIO_CONFIG_IRQ_IDX) { > > + return false; > > + } > > > I think we should either > > 1) explain why this check is needed > > or > > 2) defer this change to the patch that can actually hit this check > I will add the explanation for this , there may be cause some unexpected behavior Thanks cindy > Thanks > > > > return vhost_virtqueue_pending(&g->vhost->dev, idx); > > } > > > > @@ -493,6 +496,9 @@ vhost_user_gpu_guest_notifier_mask(VirtIODevice *vdev, int idx, bool mask) > > { > > VhostUserGPU *g = VHOST_USER_GPU(vdev); > > > > + if (idx == VIRTIO_CONFIG_IRQ_IDX) { > > + 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 1067e72b39..72ea4819f7 100644 > > --- a/hw/net/virtio-net.c > > +++ b/hw/net/virtio-net.c > > @@ -3172,6 +3172,9 @@ 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); > > + if (idx == VIRTIO_CONFIG_IRQ_IDX) { > > + return false; > > + } > > return vhost_net_virtqueue_pending(get_vhost_net(nc->peer), idx); > > } > > > > @@ -3181,8 +3184,11 @@ 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 == VIRTIO_CONFIG_IRQ_IDX) { > > + return; > > + } > > + > > + 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 c595957983..9b0349922e 100644 > > --- a/hw/virtio/vhost-user-fs.c > > +++ b/hw/virtio/vhost-user-fs.c > > @@ -161,6 +161,9 @@ static void vuf_guest_notifier_mask(VirtIODevice *vdev, int idx, > > { > > VHostUserFS *fs = VHOST_USER_FS(vdev); > > > > + if (idx == VIRTIO_CONFIG_IRQ_IDX) { > > + return; > > + } > > vhost_virtqueue_mask(&fs->vhost_dev, vdev, idx, mask); > > } > > > > @@ -168,6 +171,9 @@ static bool vuf_guest_notifier_pending(VirtIODevice *vdev, int idx) > > { > > VHostUserFS *fs = VHOST_USER_FS(vdev); > > > > + if (idx == VIRTIO_CONFIG_IRQ_IDX) { > > + 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 ed706681ac..b1f0d46209 100644 > > --- a/hw/virtio/vhost-vsock-common.c > > +++ b/hw/virtio/vhost-vsock-common.c > > @@ -125,6 +125,9 @@ static void vhost_vsock_common_guest_notifier_mask(VirtIODevice *vdev, int idx, > > { > > VHostVSockCommon *vvc = VHOST_VSOCK_COMMON(vdev); > > > > + if (idx == VIRTIO_CONFIG_IRQ_IDX) { > > + return; > > + } > > vhost_virtqueue_mask(&vvc->vhost_dev, vdev, idx, mask); > > } > > > > @@ -133,6 +136,9 @@ static bool vhost_vsock_common_guest_notifier_pending(VirtIODevice *vdev, > > { > > VHostVSockCommon *vvc = VHOST_VSOCK_COMMON(vdev); > > > > + if (idx == VIRTIO_CONFIG_IRQ_IDX) { > > + 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 dcd80b904d..7085643d5f 100644 > > --- a/hw/virtio/virtio-crypto.c > > +++ b/hw/virtio/virtio-crypto.c > > @@ -948,6 +948,9 @@ static void virtio_crypto_guest_notifier_mask(VirtIODevice *vdev, int idx, > > > > assert(vcrypto->vhost_started); > > > > + if (idx == VIRTIO_CONFIG_IRQ_IDX) { > > + return; > > + } > > cryptodev_vhost_virtqueue_mask(vdev, queue, idx, mask); > > } > > > > @@ -958,6 +961,9 @@ static bool virtio_crypto_guest_notifier_pending(VirtIODevice *vdev, int idx) > > > > assert(vcrypto->vhost_started); > > > > + if (idx == VIRTIO_CONFIG_IRQ_IDX) { > > + return false; > > + } > > return cryptodev_vhost_virtqueue_pending(vdev, queue, idx); > > } > > > > diff --git a/include/hw/virtio/virtio.h b/include/hw/virtio/virtio.h > > index b31c4507f5..4512205503 100644 > > --- a/include/hw/virtio/virtio.h > > +++ b/include/hw/virtio/virtio.h > > @@ -67,6 +67,9 @@ typedef struct VirtQueueElement > > > > #define VIRTIO_NO_VECTOR 0xffff > > > > +/* special index value used internally for config irqs */ > > +#define VIRTIO_CONFIG_IRQ_IDX -1 > > + > > #define TYPE_VIRTIO_DEVICE "virtio-device" > > OBJECT_DECLARE_TYPE(VirtIODevice, VirtioDeviceClass, VIRTIO_DEVICE) > > >
On Tue, Jul 19, 2022 at 8:53 PM Cindy Lu <lulu@redhat.com> wrote: > > On Tue, Jul 19, 2022 at 4:58 PM Jason Wang <jasowang@redhat.com> wrote: > > > > > > 在 2022/7/11 23:52, Cindy Lu 写道: > > > To support configure interrupt for vhost-vdpa > > > Introduce VIRTIO_CONFIG_IRQ_IDX -1 as configure interrupt's queue index, > > > Then we can reuse the functions guest_notifier_mask and guest_notifier_pending. > > > Add the check of queue index in these drivers, if the driver does not support > > > configure interrupt, the function will just return > > > > > > Signed-off-by: Cindy Lu <lulu@redhat.com> > > > > > > A typo in the subject should be "VIRTIO_CONFIG_IRQ_IDX". > > sure, will fix this > > > > > --- > > > hw/display/vhost-user-gpu.c | 6 ++++++ > > > hw/net/virtio-net.c | 10 ++++++++-- > > > hw/virtio/vhost-user-fs.c | 6 ++++++ > > > hw/virtio/vhost-vsock-common.c | 6 ++++++ > > > hw/virtio/virtio-crypto.c | 6 ++++++ > > > include/hw/virtio/virtio.h | 3 +++ > > > 6 files changed, 35 insertions(+), 2 deletions(-) > > > > > > diff --git a/hw/display/vhost-user-gpu.c b/hw/display/vhost-user-gpu.c > > > index 09818231bd..d4a440e815 100644 > > > --- a/hw/display/vhost-user-gpu.c > > > +++ b/hw/display/vhost-user-gpu.c > > > @@ -485,6 +485,9 @@ vhost_user_gpu_guest_notifier_pending(VirtIODevice *vdev, int idx) > > > { > > > VhostUserGPU *g = VHOST_USER_GPU(vdev); > > > > > > + if (idx == VIRTIO_CONFIG_IRQ_IDX) { > > > + return false; > > > + } > > > > > > I think we should either > > > > 1) explain why this check is needed > > > > or > > > > 2) defer this change to the patch that can actually hit this check > > I will add the explanation for this , there may be cause some unexpected behavior if we defer this check while the device itself does not support config interrupt Thanks Cindy > > Thanks > > > > > > > return vhost_virtqueue_pending(&g->vhost->dev, idx); > > > } > > > > > > @@ -493,6 +496,9 @@ vhost_user_gpu_guest_notifier_mask(VirtIODevice *vdev, int idx, bool mask) > > > { > > > VhostUserGPU *g = VHOST_USER_GPU(vdev); > > > > > > + if (idx == VIRTIO_CONFIG_IRQ_IDX) { > > > + 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 1067e72b39..72ea4819f7 100644 > > > --- a/hw/net/virtio-net.c > > > +++ b/hw/net/virtio-net.c > > > @@ -3172,6 +3172,9 @@ 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); > > > + if (idx == VIRTIO_CONFIG_IRQ_IDX) { > > > + return false; > > > + } > > > return vhost_net_virtqueue_pending(get_vhost_net(nc->peer), idx); > > > } > > > > > > @@ -3181,8 +3184,11 @@ 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 == VIRTIO_CONFIG_IRQ_IDX) { > > > + return; > > > + } > > > + > > > + 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 c595957983..9b0349922e 100644 > > > --- a/hw/virtio/vhost-user-fs.c > > > +++ b/hw/virtio/vhost-user-fs.c > > > @@ -161,6 +161,9 @@ static void vuf_guest_notifier_mask(VirtIODevice *vdev, int idx, > > > { > > > VHostUserFS *fs = VHOST_USER_FS(vdev); > > > > > > + if (idx == VIRTIO_CONFIG_IRQ_IDX) { > > > + return; > > > + } > > > vhost_virtqueue_mask(&fs->vhost_dev, vdev, idx, mask); > > > } > > > > > > @@ -168,6 +171,9 @@ static bool vuf_guest_notifier_pending(VirtIODevice *vdev, int idx) > > > { > > > VHostUserFS *fs = VHOST_USER_FS(vdev); > > > > > > + if (idx == VIRTIO_CONFIG_IRQ_IDX) { > > > + 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 ed706681ac..b1f0d46209 100644 > > > --- a/hw/virtio/vhost-vsock-common.c > > > +++ b/hw/virtio/vhost-vsock-common.c > > > @@ -125,6 +125,9 @@ static void vhost_vsock_common_guest_notifier_mask(VirtIODevice *vdev, int idx, > > > { > > > VHostVSockCommon *vvc = VHOST_VSOCK_COMMON(vdev); > > > > > > + if (idx == VIRTIO_CONFIG_IRQ_IDX) { > > > + return; > > > + } > > > vhost_virtqueue_mask(&vvc->vhost_dev, vdev, idx, mask); > > > } > > > > > > @@ -133,6 +136,9 @@ static bool vhost_vsock_common_guest_notifier_pending(VirtIODevice *vdev, > > > { > > > VHostVSockCommon *vvc = VHOST_VSOCK_COMMON(vdev); > > > > > > + if (idx == VIRTIO_CONFIG_IRQ_IDX) { > > > + 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 dcd80b904d..7085643d5f 100644 > > > --- a/hw/virtio/virtio-crypto.c > > > +++ b/hw/virtio/virtio-crypto.c > > > @@ -948,6 +948,9 @@ static void virtio_crypto_guest_notifier_mask(VirtIODevice *vdev, int idx, > > > > > > assert(vcrypto->vhost_started); > > > > > > + if (idx == VIRTIO_CONFIG_IRQ_IDX) { > > > + return; > > > + } > > > cryptodev_vhost_virtqueue_mask(vdev, queue, idx, mask); > > > } > > > > > > @@ -958,6 +961,9 @@ static bool virtio_crypto_guest_notifier_pending(VirtIODevice *vdev, int idx) > > > > > > assert(vcrypto->vhost_started); > > > > > > + if (idx == VIRTIO_CONFIG_IRQ_IDX) { > > > + return false; > > > + } > > > return cryptodev_vhost_virtqueue_pending(vdev, queue, idx); > > > } > > > > > > diff --git a/include/hw/virtio/virtio.h b/include/hw/virtio/virtio.h > > > index b31c4507f5..4512205503 100644 > > > --- a/include/hw/virtio/virtio.h > > > +++ b/include/hw/virtio/virtio.h > > > @@ -67,6 +67,9 @@ typedef struct VirtQueueElement > > > > > > #define VIRTIO_NO_VECTOR 0xffff > > > > > > +/* special index value used internally for config irqs */ > > > +#define VIRTIO_CONFIG_IRQ_IDX -1 > > > + > > > #define TYPE_VIRTIO_DEVICE "virtio-device" > > > OBJECT_DECLARE_TYPE(VirtIODevice, VirtioDeviceClass, VIRTIO_DEVICE) > > > > >
diff --git a/hw/display/vhost-user-gpu.c b/hw/display/vhost-user-gpu.c index 09818231bd..d4a440e815 100644 --- a/hw/display/vhost-user-gpu.c +++ b/hw/display/vhost-user-gpu.c @@ -485,6 +485,9 @@ vhost_user_gpu_guest_notifier_pending(VirtIODevice *vdev, int idx) { VhostUserGPU *g = VHOST_USER_GPU(vdev); + if (idx == VIRTIO_CONFIG_IRQ_IDX) { + return false; + } return vhost_virtqueue_pending(&g->vhost->dev, idx); } @@ -493,6 +496,9 @@ vhost_user_gpu_guest_notifier_mask(VirtIODevice *vdev, int idx, bool mask) { VhostUserGPU *g = VHOST_USER_GPU(vdev); + if (idx == VIRTIO_CONFIG_IRQ_IDX) { + 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 1067e72b39..72ea4819f7 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -3172,6 +3172,9 @@ 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); + if (idx == VIRTIO_CONFIG_IRQ_IDX) { + return false; + } return vhost_net_virtqueue_pending(get_vhost_net(nc->peer), idx); } @@ -3181,8 +3184,11 @@ 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 == VIRTIO_CONFIG_IRQ_IDX) { + return; + } + + 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 c595957983..9b0349922e 100644 --- a/hw/virtio/vhost-user-fs.c +++ b/hw/virtio/vhost-user-fs.c @@ -161,6 +161,9 @@ static void vuf_guest_notifier_mask(VirtIODevice *vdev, int idx, { VHostUserFS *fs = VHOST_USER_FS(vdev); + if (idx == VIRTIO_CONFIG_IRQ_IDX) { + return; + } vhost_virtqueue_mask(&fs->vhost_dev, vdev, idx, mask); } @@ -168,6 +171,9 @@ static bool vuf_guest_notifier_pending(VirtIODevice *vdev, int idx) { VHostUserFS *fs = VHOST_USER_FS(vdev); + if (idx == VIRTIO_CONFIG_IRQ_IDX) { + 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 ed706681ac..b1f0d46209 100644 --- a/hw/virtio/vhost-vsock-common.c +++ b/hw/virtio/vhost-vsock-common.c @@ -125,6 +125,9 @@ static void vhost_vsock_common_guest_notifier_mask(VirtIODevice *vdev, int idx, { VHostVSockCommon *vvc = VHOST_VSOCK_COMMON(vdev); + if (idx == VIRTIO_CONFIG_IRQ_IDX) { + return; + } vhost_virtqueue_mask(&vvc->vhost_dev, vdev, idx, mask); } @@ -133,6 +136,9 @@ static bool vhost_vsock_common_guest_notifier_pending(VirtIODevice *vdev, { VHostVSockCommon *vvc = VHOST_VSOCK_COMMON(vdev); + if (idx == VIRTIO_CONFIG_IRQ_IDX) { + 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 dcd80b904d..7085643d5f 100644 --- a/hw/virtio/virtio-crypto.c +++ b/hw/virtio/virtio-crypto.c @@ -948,6 +948,9 @@ static void virtio_crypto_guest_notifier_mask(VirtIODevice *vdev, int idx, assert(vcrypto->vhost_started); + if (idx == VIRTIO_CONFIG_IRQ_IDX) { + return; + } cryptodev_vhost_virtqueue_mask(vdev, queue, idx, mask); } @@ -958,6 +961,9 @@ static bool virtio_crypto_guest_notifier_pending(VirtIODevice *vdev, int idx) assert(vcrypto->vhost_started); + if (idx == VIRTIO_CONFIG_IRQ_IDX) { + return false; + } return cryptodev_vhost_virtqueue_pending(vdev, queue, idx); } diff --git a/include/hw/virtio/virtio.h b/include/hw/virtio/virtio.h index b31c4507f5..4512205503 100644 --- a/include/hw/virtio/virtio.h +++ b/include/hw/virtio/virtio.h @@ -67,6 +67,9 @@ typedef struct VirtQueueElement #define VIRTIO_NO_VECTOR 0xffff +/* special index value used internally for config irqs */ +#define VIRTIO_CONFIG_IRQ_IDX -1 + #define TYPE_VIRTIO_DEVICE "virtio-device" OBJECT_DECLARE_TYPE(VirtIODevice, VirtioDeviceClass, VIRTIO_DEVICE)
To support configure interrupt for vhost-vdpa Introduce VIRTIO_CONFIG_IRQ_IDX -1 as configure interrupt's queue index, Then we can reuse the functions guest_notifier_mask and guest_notifier_pending. Add the check of queue index in these drivers, if the driver does not support configure interrupt, the function will just return Signed-off-by: Cindy Lu <lulu@redhat.com> --- hw/display/vhost-user-gpu.c | 6 ++++++ hw/net/virtio-net.c | 10 ++++++++-- hw/virtio/vhost-user-fs.c | 6 ++++++ hw/virtio/vhost-vsock-common.c | 6 ++++++ hw/virtio/virtio-crypto.c | 6 ++++++ include/hw/virtio/virtio.h | 3 +++ 6 files changed, 35 insertions(+), 2 deletions(-)