228 lines
7.5 KiB
Diff
228 lines
7.5 KiB
Diff
|
|
From 61630772adbe254719e312fb7704a8edd00cc72b Mon Sep 17 00:00:00 2001
|
||
|
|
From: Cindy Lu <lulu@redhat.com>
|
||
|
|
Date: Thu, 22 Dec 2022 15:04:42 +0800
|
||
|
|
Subject: [PATCH] virtio: introduce macro VIRTIO_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: <20221222070451.936503-2-lulu@redhat.com>
|
||
|
|
Acked-by: Jason Wang <jasowang@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 | 18 ++++++++++++++++++
|
||
|
|
hw/net/virtio-net.c | 22 ++++++++++++++++++++--
|
||
|
|
hw/virtio/vhost-user-fs.c | 18 ++++++++++++++++++
|
||
|
|
hw/virtio/vhost-vsock-common.c | 18 ++++++++++++++++++
|
||
|
|
hw/virtio/virtio-crypto.c | 18 ++++++++++++++++++
|
||
|
|
include/hw/virtio/virtio.h | 3 +++
|
||
|
|
6 files changed, 95 insertions(+), 2 deletions(-)
|
||
|
|
|
||
|
|
diff --git a/hw/display/vhost-user-gpu.c b/hw/display/vhost-user-gpu.c
|
||
|
|
index 6e93b463d6..1c78272a83 100644
|
||
|
|
--- a/hw/display/vhost-user-gpu.c
|
||
|
|
+++ b/hw/display/vhost-user-gpu.c
|
||
|
|
@@ -485,6 +485,15 @@ vhost_user_gpu_guest_notifier_pending(VirtIODevice *vdev, int idx)
|
||
|
|
{
|
||
|
|
VhostUserGPU *g = VHOST_USER_GPU(vdev);
|
||
|
|
|
||
|
|
+ /*
|
||
|
|
+ * Add the check for configure interrupt, Use VIRTIO_CONFIG_IRQ_IDX -1
|
||
|
|
+ * as the Marco of configure interrupt's IDX, If this driver does not
|
||
|
|
+ * support, the function will return
|
||
|
|
+ */
|
||
|
|
+
|
||
|
|
+ if (idx == VIRTIO_CONFIG_IRQ_IDX) {
|
||
|
|
+ return false;
|
||
|
|
+ }
|
||
|
|
return vhost_virtqueue_pending(&g->vhost->dev, idx);
|
||
|
|
}
|
||
|
|
|
||
|
|
@@ -493,6 +502,15 @@ vhost_user_gpu_guest_notifier_mask(VirtIODevice *vdev, int idx, bool mask)
|
||
|
|
{
|
||
|
|
VhostUserGPU *g = VHOST_USER_GPU(vdev);
|
||
|
|
|
||
|
|
+ /*
|
||
|
|
+ * Add the check for configure interrupt, Use VIRTIO_CONFIG_IRQ_IDX -1
|
||
|
|
+ * as the Marco of configure interrupt's IDX, If this driver does not
|
||
|
|
+ * support, the function will return
|
||
|
|
+ */
|
||
|
|
+
|
||
|
|
+ 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 867a1e77dc..304f501da5 100644
|
||
|
|
--- a/hw/net/virtio-net.c
|
||
|
|
+++ b/hw/net/virtio-net.c
|
||
|
|
@@ -3232,6 +3232,15 @@ static bool virtio_net_guest_notifier_pending(VirtIODevice *vdev, int idx)
|
||
|
|
} else {
|
||
|
|
nc = qemu_get_subqueue(n->nic, vq2q(idx));
|
||
|
|
}
|
||
|
|
+ /*
|
||
|
|
+ * Add the check for configure interrupt, Use VIRTIO_CONFIG_IRQ_IDX -1
|
||
|
|
+ * as the Marco of configure interrupt's IDX, If this driver does not
|
||
|
|
+ * support, the function will return false
|
||
|
|
+ */
|
||
|
|
+
|
||
|
|
+ if (idx == VIRTIO_CONFIG_IRQ_IDX) {
|
||
|
|
+ return false;
|
||
|
|
+ }
|
||
|
|
return vhost_net_virtqueue_pending(get_vhost_net(nc->peer), idx);
|
||
|
|
}
|
||
|
|
|
||
|
|
@@ -3255,8 +3264,17 @@ static void virtio_net_guest_notifier_mask(VirtIODevice *vdev, int idx,
|
||
|
|
} else {
|
||
|
|
nc = qemu_get_subqueue(n->nic, vq2q(idx));
|
||
|
|
}
|
||
|
|
- vhost_net_virtqueue_mask(get_vhost_net(nc->peer),
|
||
|
|
- vdev, idx, mask);
|
||
|
|
+ /*
|
||
|
|
+ *Add the check for configure interrupt, Use VIRTIO_CONFIG_IRQ_IDX -1
|
||
|
|
+ * as the Marco of configure interrupt's IDX, If this driver does not
|
||
|
|
+ * support, the function will return
|
||
|
|
+ */
|
||
|
|
+
|
||
|
|
+ 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 c2739557f2..0c6ecd3b4f 100644
|
||
|
|
--- a/hw/virtio/vhost-user-fs.c
|
||
|
|
+++ b/hw/virtio/vhost-user-fs.c
|
||
|
|
@@ -161,6 +161,15 @@ static void vuf_guest_notifier_mask(VirtIODevice *vdev, int idx,
|
||
|
|
{
|
||
|
|
VHostUserFS *fs = VHOST_USER_FS(vdev);
|
||
|
|
|
||
|
|
+ /*
|
||
|
|
+ * Add the check for configure interrupt, Use VIRTIO_CONFIG_IRQ_IDX -1
|
||
|
|
+ * as the Marco of configure interrupt's IDX, If this driver does not
|
||
|
|
+ * support, the function will return
|
||
|
|
+ */
|
||
|
|
+
|
||
|
|
+ if (idx == VIRTIO_CONFIG_IRQ_IDX) {
|
||
|
|
+ return;
|
||
|
|
+ }
|
||
|
|
vhost_virtqueue_mask(&fs->vhost_dev, vdev, idx, mask);
|
||
|
|
}
|
||
|
|
|
||
|
|
@@ -168,6 +177,15 @@ static bool vuf_guest_notifier_pending(VirtIODevice *vdev, int idx)
|
||
|
|
{
|
||
|
|
VHostUserFS *fs = VHOST_USER_FS(vdev);
|
||
|
|
|
||
|
|
+ /*
|
||
|
|
+ * Add the check for configure interrupt, Use VIRTIO_CONFIG_IRQ_IDX -1
|
||
|
|
+ * as the Marco of configure interrupt's IDX, If this driver does not
|
||
|
|
+ * support, the function will return
|
||
|
|
+ */
|
||
|
|
+
|
||
|
|
+ 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 42e4db4712..e4a8d90f4c 100644
|
||
|
|
--- a/hw/virtio/vhost-vsock-common.c
|
||
|
|
+++ b/hw/virtio/vhost-vsock-common.c
|
||
|
|
@@ -125,6 +125,15 @@ static void vhost_vsock_common_guest_notifier_mask(VirtIODevice *vdev, int idx,
|
||
|
|
{
|
||
|
|
VHostVSockCommon *vvc = VHOST_VSOCK_COMMON(vdev);
|
||
|
|
|
||
|
|
+ /*
|
||
|
|
+ * Add the check for configure interrupt, Use VIRTIO_CONFIG_IRQ_IDX -1
|
||
|
|
+ * as the Marco of configure interrupt's IDX, If this driver does not
|
||
|
|
+ * support, the function will return
|
||
|
|
+ */
|
||
|
|
+
|
||
|
|
+ if (idx == VIRTIO_CONFIG_IRQ_IDX) {
|
||
|
|
+ return;
|
||
|
|
+ }
|
||
|
|
vhost_virtqueue_mask(&vvc->vhost_dev, vdev, idx, mask);
|
||
|
|
}
|
||
|
|
|
||
|
|
@@ -133,6 +142,15 @@ static bool vhost_vsock_common_guest_notifier_pending(VirtIODevice *vdev,
|
||
|
|
{
|
||
|
|
VHostVSockCommon *vvc = VHOST_VSOCK_COMMON(vdev);
|
||
|
|
|
||
|
|
+ /*
|
||
|
|
+ * Add the check for configure interrupt, Use VIRTIO_CONFIG_IRQ_IDX -1
|
||
|
|
+ * as the Marco of configure interrupt's IDX, If this driver does not
|
||
|
|
+ * support, the function will return
|
||
|
|
+ */
|
||
|
|
+
|
||
|
|
+ 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 f9d849fa43..98304184cd 100644
|
||
|
|
--- a/hw/virtio/virtio-crypto.c
|
||
|
|
+++ b/hw/virtio/virtio-crypto.c
|
||
|
|
@@ -953,6 +953,15 @@ static void virtio_crypto_guest_notifier_mask(VirtIODevice *vdev, int idx,
|
||
|
|
|
||
|
|
assert(vcrypto->vhost_started);
|
||
|
|
|
||
|
|
+ /*
|
||
|
|
+ * Add the check for configure interrupt, Use VIRTIO_CONFIG_IRQ_IDX -1
|
||
|
|
+ * as the Marco of configure interrupt's IDX, If this driver does not
|
||
|
|
+ * support, the function will return
|
||
|
|
+ */
|
||
|
|
+
|
||
|
|
+ if (idx == VIRTIO_CONFIG_IRQ_IDX) {
|
||
|
|
+ return;
|
||
|
|
+ }
|
||
|
|
cryptodev_vhost_virtqueue_mask(vdev, queue, idx, mask);
|
||
|
|
}
|
||
|
|
|
||
|
|
@@ -963,6 +972,15 @@ static bool virtio_crypto_guest_notifier_pending(VirtIODevice *vdev, int idx)
|
||
|
|
|
||
|
|
assert(vcrypto->vhost_started);
|
||
|
|
|
||
|
|
+ /*
|
||
|
|
+ * Add the check for configure interrupt, Use VIRTIO_CONFIG_IRQ_IDX -1
|
||
|
|
+ * as the Marco of configure interrupt's IDX, If this driver does not
|
||
|
|
+ * support, the function will return
|
||
|
|
+ */
|
||
|
|
+
|
||
|
|
+ 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 223e82436f..91d1c3433a 100644
|
||
|
|
--- a/include/hw/virtio/virtio.h
|
||
|
|
+++ b/include/hw/virtio/virtio.h
|
||
|
|
@@ -69,6 +69,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
|
||
|
|
|