Message ID | 20201120185105.279030-10-eperezma@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | vDPA software assisted live migration | expand |
On Fri, Nov 20, 2020 at 07:50:47PM +0100, Eugenio Pérez wrote: > Signed-off-by: Eugenio Pérez <eperezma@redhat.com> > --- > hw/virtio/vhost-sw-lm-ring.c | 3 +++ > hw/virtio/vhost.c | 20 ++++++++++++++++++++ > 2 files changed, 23 insertions(+) I'm not sure I understand what is going here. The guest notifier masking feature exists to support MSI masking semantics. It looks like this patch repurposes the notifier to decouple the vhost hdev from the virtio device's irqfd? But this breaks MSI masking. I think you need to set up your own eventfd and assign it to the vhost hdev's call fd instead of using the mask notifier. > > diff --git a/hw/virtio/vhost-sw-lm-ring.c b/hw/virtio/vhost-sw-lm-ring.c > index 0192e77831..cbf53965cd 100644 > --- a/hw/virtio/vhost-sw-lm-ring.c > +++ b/hw/virtio/vhost-sw-lm-ring.c > @@ -50,6 +50,9 @@ VhostShadowVirtqueue *vhost_sw_lm_shadow_vq(struct vhost_dev *dev, int idx) > r = dev->vhost_ops->vhost_set_vring_kick(dev, &file); > assert(r == 0); > > + vhost_virtqueue_mask(dev, dev->vdev, idx, true); > + vhost_virtqueue_pending(dev, idx); Why is the mask notifier cleared? Could we lose a guest notification here? > + > return svq; > } > > diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c > index 1d55e26d45..9352c56bfa 100644 > --- a/hw/virtio/vhost.c > +++ b/hw/virtio/vhost.c > @@ -960,12 +960,29 @@ static void handle_sw_lm_vq(VirtIODevice *vdev, VirtQueue *vq) > vhost_vring_kick(svq); > } > > +static void vhost_handle_call(EventNotifier *n) > +{ > + struct vhost_virtqueue *hvq = container_of(n, > + struct vhost_virtqueue, > + masked_notifier); > + struct vhost_dev *vdev = hvq->dev; > + int idx = vdev->vq_index + (hvq == &vdev->vqs[0] ? 0 : 1); vhost-net-specific hack > + VirtQueue *vq = virtio_get_queue(vdev->vdev, idx); > + > + if (event_notifier_test_and_clear(n)) { > + virtio_queue_invalidate_signalled_used(vdev->vdev, idx); > + virtio_notify_irqfd(vdev->vdev, vq); /* TODO push used elements into vq? */
diff --git a/hw/virtio/vhost-sw-lm-ring.c b/hw/virtio/vhost-sw-lm-ring.c index 0192e77831..cbf53965cd 100644 --- a/hw/virtio/vhost-sw-lm-ring.c +++ b/hw/virtio/vhost-sw-lm-ring.c @@ -50,6 +50,9 @@ VhostShadowVirtqueue *vhost_sw_lm_shadow_vq(struct vhost_dev *dev, int idx) r = dev->vhost_ops->vhost_set_vring_kick(dev, &file); assert(r == 0); + vhost_virtqueue_mask(dev, dev->vdev, idx, true); + vhost_virtqueue_pending(dev, idx); + return svq; } diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c index 1d55e26d45..9352c56bfa 100644 --- a/hw/virtio/vhost.c +++ b/hw/virtio/vhost.c @@ -960,12 +960,29 @@ static void handle_sw_lm_vq(VirtIODevice *vdev, VirtQueue *vq) vhost_vring_kick(svq); } +static void vhost_handle_call(EventNotifier *n) +{ + struct vhost_virtqueue *hvq = container_of(n, + struct vhost_virtqueue, + masked_notifier); + struct vhost_dev *vdev = hvq->dev; + int idx = vdev->vq_index + (hvq == &vdev->vqs[0] ? 0 : 1); + VirtQueue *vq = virtio_get_queue(vdev->vdev, idx); + + if (event_notifier_test_and_clear(n)) { + virtio_queue_invalidate_signalled_used(vdev->vdev, idx); + virtio_notify_irqfd(vdev->vdev, vq); + } +} + static int vhost_sw_live_migration_stop(struct vhost_dev *dev) { int idx; vhost_dev_enable_notifiers(dev, dev->vdev); for (idx = 0; idx < dev->nvqs; ++idx) { + vhost_virtqueue_mask(dev, dev->vdev, idx, false); + vhost_virtqueue_pending(dev, idx); vhost_sw_lm_shadow_vq_free(dev->sw_lm_shadow_vq[idx]); } @@ -977,7 +994,10 @@ static int vhost_sw_live_migration_start(struct vhost_dev *dev) int idx; for (idx = 0; idx < dev->nvqs; ++idx) { + struct vhost_virtqueue *vq = &dev->vqs[idx]; + dev->sw_lm_shadow_vq[idx] = vhost_sw_lm_shadow_vq(dev, idx); + event_notifier_set_handler(&vq->masked_notifier, vhost_handle_call); } vhost_dev_disable_notifiers(dev, dev->vdev);
Signed-off-by: Eugenio Pérez <eperezma@redhat.com> --- hw/virtio/vhost-sw-lm-ring.c | 3 +++ hw/virtio/vhost.c | 20 ++++++++++++++++++++ 2 files changed, 23 insertions(+)