Jason Wang
2022-Feb-28 03:18 UTC
[PATCH v2 03/14] vhost: Add Shadow VirtQueue call forwarding capabilities
? 2022/2/27 ??9:41, Eugenio P?rez ??:> This will make qemu aware of the device used buffers, allowing it to > write the guest memory with its contents if needed. > > Signed-off-by: Eugenio P?rez <eperezma at redhat.com> > --- > hw/virtio/vhost-shadow-virtqueue.h | 4 ++++ > hw/virtio/vhost-shadow-virtqueue.c | 34 ++++++++++++++++++++++++++++++ > hw/virtio/vhost-vdpa.c | 31 +++++++++++++++++++++++++-- > 3 files changed, 67 insertions(+), 2 deletions(-) > > diff --git a/hw/virtio/vhost-shadow-virtqueue.h b/hw/virtio/vhost-shadow-virtqueue.h > index 1cbc87d5d8..1d4c160d0a 100644 > --- a/hw/virtio/vhost-shadow-virtqueue.h > +++ b/hw/virtio/vhost-shadow-virtqueue.h > @@ -28,9 +28,13 @@ typedef struct VhostShadowVirtqueue { > * So shadow virtqueue must not clean it, or we would lose VirtQueue one. > */ > EventNotifier svq_kick; > + > + /* Guest's call notifier, where the SVQ calls guest. */ > + EventNotifier svq_call; > } VhostShadowVirtqueue; > > void vhost_svq_set_svq_kick_fd(VhostShadowVirtqueue *svq, int svq_kick_fd); > +void vhost_svq_set_guest_call_notifier(VhostShadowVirtqueue *svq, int call_fd); > > void vhost_svq_stop(VhostShadowVirtqueue *svq); > > diff --git a/hw/virtio/vhost-shadow-virtqueue.c b/hw/virtio/vhost-shadow-virtqueue.c > index a5d0659f86..54c701a196 100644 > --- a/hw/virtio/vhost-shadow-virtqueue.c > +++ b/hw/virtio/vhost-shadow-virtqueue.c > @@ -23,6 +23,38 @@ static void vhost_handle_guest_kick(EventNotifier *n) > event_notifier_set(&svq->hdev_kick); > } > > +/* Forward vhost notifications */ > +static void vhost_svq_handle_call(EventNotifier *n) > +{ > + VhostShadowVirtqueue *svq = container_of(n, VhostShadowVirtqueue, > + hdev_call); > + event_notifier_test_and_clear(n); > + event_notifier_set(&svq->svq_call); > +} > + > +/** > + * Set the call notifier for the SVQ to call the guest > + * > + * @svq Shadow virtqueue > + * @call_fd call notifier > + * > + * Called on BQL context. > + */ > +void vhost_svq_set_guest_call_notifier(VhostShadowVirtqueue *svq, int call_fd)I think we need to have consistent naming for both kick and call. Note that in patch 2 we had vhost_svq_set_svq_kick_fd Maybe it's better to use vhost_svq_set_guest_call_fd() here.> +{ > + if (call_fd == VHOST_FILE_UNBIND) { > + /* > + * Fail event_notifier_set if called handling device call. > + * > + * SVQ still needs device notifications, since it needs to keep > + * forwarding used buffers even with the unbind. > + */ > + memset(&svq->svq_call, 0, sizeof(svq->svq_call));I may miss something but shouldn't we stop polling svq_call here like event_notifier_set_handle(&svq->svq_call, false); ? Thanks