[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[RFC PATCH v9 16/23] vhost: Add svq avail_handler callback
From: |
Eugenio Pérez |
Subject: |
[RFC PATCH v9 16/23] vhost: Add svq avail_handler callback |
Date: |
Wed, 6 Jul 2022 20:40:01 +0200 |
This allows external handlers to be aware of new buffers that the guest
places in the virtqueue.
When this callback is defined the ownership of guest's virtqueue element
is transferred to the callback. This means that if the user wants to
forward the descriptor it needs to manually inject it. The callback is
also free to process the command by itself and use the element with
svq_push.
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
---
hw/virtio/vhost-shadow-virtqueue.h | 16 ++++++++++++++++
hw/virtio/vhost-shadow-virtqueue.c | 8 +++++++-
2 files changed, 23 insertions(+), 1 deletion(-)
diff --git a/hw/virtio/vhost-shadow-virtqueue.h
b/hw/virtio/vhost-shadow-virtqueue.h
index 296fef6f21..4300cb66f8 100644
--- a/hw/virtio/vhost-shadow-virtqueue.h
+++ b/hw/virtio/vhost-shadow-virtqueue.h
@@ -27,12 +27,28 @@ typedef struct VhostShadowVirtqueue VhostShadowVirtqueue;
typedef int (*ShadowVirtQueueStart)(VhostShadowVirtqueue *svq,
void *opaque);
+/**
+ * Callback to handle an avail buffer.
+ *
+ * @svq: Shadow virtqueue
+ * @elem: Element placed in the queue by the guest
+ * @vq_callback_opaque: Opaque
+ *
+ * Returns true if the vq is running as expected, false otherwise.
+ *
+ * Note that ownership of elem is transferred to the callback.
+ */
+typedef bool (*VirtQueueAvailCallback)(VhostShadowVirtqueue *svq,
+ VirtQueueElement *elem,
+ void *vq_callback_opaque);
+
typedef void (*VirtQueueUsedCallback)(VhostShadowVirtqueue *svq,
void *used_elem_opaque,
uint32_t written);
typedef struct VhostShadowVirtqueueOps {
ShadowVirtQueueStart start;
+ VirtQueueAvailCallback avail_handler;
VirtQueueUsedCallback used_handler;
} VhostShadowVirtqueueOps;
diff --git a/hw/virtio/vhost-shadow-virtqueue.c
b/hw/virtio/vhost-shadow-virtqueue.c
index b92ca4a63f..dffea256f1 100644
--- a/hw/virtio/vhost-shadow-virtqueue.c
+++ b/hw/virtio/vhost-shadow-virtqueue.c
@@ -371,7 +371,13 @@ static void vhost_handle_guest_kick(VhostShadowVirtqueue
*svq)
return;
}
- ok = vhost_svq_add_element(svq, g_steal_pointer(&elem));
+ if (svq->ops) {
+ ok = svq->ops->avail_handler(svq, g_steal_pointer(&elem),
+ svq->ops_opaque);
+ } else {
+ ok = vhost_svq_add_element(svq, g_steal_pointer(&elem));
+ }
+
if (unlikely(!ok)) {
/* VQ is broken, just return and ignore any other kicks */
return;
--
2.31.1
[RFC PATCH v9 16/23] vhost: Add svq avail_handler callback,
Eugenio Pérez <=
[RFC PATCH v9 13/23] vhost: Add vhost_svq_inject, Eugenio Pérez, 2022/07/06
[RFC PATCH v9 10/23] vhost: Reorder vhost_svq_last_desc_of_chain, Eugenio Pérez, 2022/07/06
[RFC PATCH v9 14/23] vhost: add vhost_svq_poll, Eugenio Pérez, 2022/07/06
[RFC PATCH v9 15/23] vhost: Add custom used buffer callback, Eugenio Pérez, 2022/07/06
[RFC PATCH v9 17/23] vhost: add detach SVQ operation, Eugenio Pérez, 2022/07/06