It allows to run commands at start of the device, before it have enabled any queue.
Signed-off-by: Eugenio Pérez <epere...@redhat.com> --- hw/virtio/vhost-shadow-virtqueue.h | 3 +++ include/hw/virtio/vhost-vdpa.h | 5 +++++ hw/virtio/vhost-vdpa.c | 8 ++++++++ 3 files changed, 16 insertions(+) diff --git a/hw/virtio/vhost-shadow-virtqueue.h b/hw/virtio/vhost-shadow-virtqueue.h index 03eb7ff670..210fe393cd 100644 --- a/hw/virtio/vhost-shadow-virtqueue.h +++ b/hw/virtio/vhost-shadow-virtqueue.h @@ -26,6 +26,8 @@ typedef struct SVQDescState { } SVQDescState; typedef struct VhostShadowVirtqueue VhostShadowVirtqueue; +typedef int (*ShadowVirtQueueStart)(VhostShadowVirtqueue *svq, + void *opaque); /** * Callback to handle an avail buffer. @@ -43,6 +45,7 @@ typedef int (*VirtQueueAvailCallback)(VhostShadowVirtqueue *svq, void *vq_callback_opaque); typedef struct VhostShadowVirtqueueOps { + ShadowVirtQueueStart start; VirtQueueAvailCallback avail_handler; } VhostShadowVirtqueueOps; diff --git a/include/hw/virtio/vhost-vdpa.h b/include/hw/virtio/vhost-vdpa.h index d10a89303e..b7d18b4e30 100644 --- a/include/hw/virtio/vhost-vdpa.h +++ b/include/hw/virtio/vhost-vdpa.h @@ -24,6 +24,10 @@ typedef struct VhostVDPAHostNotifier { void *addr; } VhostVDPAHostNotifier; +struct vhost_vdpa; +/* Called after send DRIVER_OK but after enabling vrings */ +typedef int (*VhostVDPAStartOp)(struct vhost_vdpa *v); + typedef struct vhost_vdpa { int device_fd; int index; @@ -39,6 +43,7 @@ typedef struct vhost_vdpa { GPtrArray *shadow_vqs; const VhostShadowVirtqueueOps *shadow_vq_ops; void *shadow_vq_ops_opaque; + VhostVDPAStartOp start_op; struct vhost_dev *dev; VhostVDPAHostNotifier notifier[VIRTIO_QUEUE_MAX]; } VhostVDPA; diff --git a/hw/virtio/vhost-vdpa.c b/hw/virtio/vhost-vdpa.c index 1d8829c619..48f031b8c0 100644 --- a/hw/virtio/vhost-vdpa.c +++ b/hw/virtio/vhost-vdpa.c @@ -1136,6 +1136,14 @@ static int vhost_vdpa_dev_start(struct vhost_dev *dev, bool started) if (unlikely(r)) { return r; } + + if (v->start_op) { + r = v->start_op(v); + if (unlikely(r)) { + return r; + } + } + vhost_vdpa_set_vring_ready(dev); } else { vhost_vdpa_reset_device(dev); -- 2.31.1