79c4324644
Change-Id: I2d302dda68298877c65c99147f5bf22186a59aac
167 lines
5.4 KiB
Diff
167 lines
5.4 KiB
Diff
From 438e224baf7c2debab5ac109739316d9db562e2c Mon Sep 17 00:00:00 2001
|
|
From: fangyi <eric.fangyi@huawei.com>
|
|
Date: Thu, 16 Nov 2023 09:54:50 +0800
|
|
Subject: [PATCH] virtio: introduce macro IRTIO_CONFIG_IRQ_IDX
|
|
|
|
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>
|
|
Message-Id: <20211104164827.21911-2-lulu@redhat.com>
|
|
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
|
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
|
Signed-off-by: fangyi <eric.fangyi@huawei.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(-)
|
|
|
|
diff --git a/hw/display/vhost-user-gpu.c b/hw/display/vhost-user-gpu.c
|
|
index 49df56cd14..73ad3d84c9 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 3bd786cc22..7537f44d10 100644
|
|
--- a/hw/net/virtio-net.c
|
|
+++ b/hw/net/virtio-net.c
|
|
@@ -3195,6 +3195,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);
|
|
}
|
|
|
|
@@ -3204,8 +3207,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 fc7dcc96ef..90c2bc9c5d 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 274c7b4dea..52ba34ef1e 100644
|
|
--- a/hw/virtio/virtio-crypto.c
|
|
+++ b/hw/virtio/virtio-crypto.c
|
|
@@ -953,6 +953,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);
|
|
}
|
|
|
|
@@ -963,6 +966,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 7472145821..c113a5b864 100644
|
|
--- a/include/hw/virtio/virtio.h
|
|
+++ b/include/hw/virtio/virtio.h
|
|
@@ -68,6 +68,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)
|
|
|
|
--
|
|
2.27.0
|
|
|