|
@@ -25,6 +25,27 @@ typedef struct SVQDescState {
|
|
|
unsigned int ndescs;
|
|
|
} SVQDescState;
|
|
|
|
|
|
+typedef struct VhostShadowVirtqueue VhostShadowVirtqueue;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Callback to handle an avail buffer.
|
|
|
+ *
|
|
|
+ * @svq: Shadow virtqueue
|
|
|
+ * @elem: Element placed in the queue by the guest
|
|
|
+ * @vq_callback_opaque: Opaque
|
|
|
+ *
|
|
|
+ * Returns 0 if the vq is running as expected.
|
|
|
+ *
|
|
|
+ * Note that ownership of elem is transferred to the callback.
|
|
|
+ */
|
|
|
+typedef int (*VirtQueueAvailCallback)(VhostShadowVirtqueue *svq,
|
|
|
+ VirtQueueElement *elem,
|
|
|
+ void *vq_callback_opaque);
|
|
|
+
|
|
|
+typedef struct VhostShadowVirtqueueOps {
|
|
|
+ VirtQueueAvailCallback avail_handler;
|
|
|
+} VhostShadowVirtqueueOps;
|
|
|
+
|
|
|
/* Shadow virtqueue to relay notifications */
|
|
|
typedef struct VhostShadowVirtqueue {
|
|
|
/* Shadow vring */
|
|
@@ -69,6 +90,12 @@ typedef struct VhostShadowVirtqueue {
|
|
|
*/
|
|
|
uint16_t *desc_next;
|
|
|
|
|
|
+ /* Caller callbacks */
|
|
|
+ const VhostShadowVirtqueueOps *ops;
|
|
|
+
|
|
|
+ /* Caller callbacks opaque */
|
|
|
+ void *ops_opaque;
|
|
|
+
|
|
|
/* Next head to expose to the device */
|
|
|
uint16_t shadow_avail_idx;
|
|
|
|
|
@@ -102,7 +129,9 @@ void vhost_svq_start(VhostShadowVirtqueue *svq, VirtIODevice *vdev,
|
|
|
VirtQueue *vq);
|
|
|
void vhost_svq_stop(VhostShadowVirtqueue *svq);
|
|
|
|
|
|
-VhostShadowVirtqueue *vhost_svq_new(VhostIOVATree *iova_tree);
|
|
|
+VhostShadowVirtqueue *vhost_svq_new(VhostIOVATree *iova_tree,
|
|
|
+ const VhostShadowVirtqueueOps *ops,
|
|
|
+ void *ops_opaque);
|
|
|
|
|
|
void vhost_svq_free(gpointer vq);
|
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(VhostShadowVirtqueue, vhost_svq_free);
|