[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [RFC v2 7/7] vhost: Route host->guest notification through shadow vi
From: |
Eugenio Perez Martin |
Subject: |
Re: [RFC v2 7/7] vhost: Route host->guest notification through shadow virtqueue |
Date: |
Wed, 17 Feb 2021 20:13:02 +0100 |
On Wed, Feb 17, 2021 at 6:24 PM Stefan Hajnoczi <stefanha@redhat.com> wrote:
>
> On Tue, Feb 09, 2021 at 04:37:57PM +0100, Eugenio Pérez wrote:
> > @@ -40,6 +42,26 @@ static void vhost_handle_guest_kick(EventNotifier *n)
> > }
> > }
> >
> > +/* Forward vhost notifications */
> > +static void vhost_handle_call(EventNotifier *n)
>
> The name vhost_shadow_vq_handle_call() expresses the purpose of the
> function more clearly.
>
I will rename it.
> > @@ -75,8 +102,19 @@ bool vhost_shadow_vq_start_rcu(struct vhost_dev *dev,
> > /* Check for pending notifications from the guest */
> > vhost_handle_guest_kick(&svq->host_notifier);
> >
> > + r = dev->vhost_ops->vhost_set_vring_call(dev, &call_file);
> > + if (r != 0) {
> > + error_report("Couldn't set call fd: %s", strerror(errno));
> > + goto err_set_vring_call;
> > + }
>
> This ignores notifier_is_masked and always unmasks.
Right, I will check for it too.
>
> > @@ -1608,6 +1607,10 @@ void vhost_virtqueue_mask(struct vhost_dev *hdev,
> > VirtIODevice *vdev, int n,
> > if (mask) {
> > assert(vdev->use_guest_notifier_mask);
> > file.fd = event_notifier_get_fd(&hdev->vqs[index].masked_notifier);
> > + } else if (hdev->sw_lm_enabled) {
> > + VhostShadowVirtqueue *svq = hdev->shadow_vqs[n];
> > + EventNotifier *e = vhost_shadow_vq_get_call_notifier(svq);
> > + file.fd = event_notifier_get_fd(e);
> > } else {
> > file.fd =
> > event_notifier_get_fd(virtio_queue_get_guest_notifier(vvq));
> > }
>
> Maybe you can extend this function so it can be called unconditionally
> from both vhost_shadow_vq_start_rcu() and vhost_shadow_vq_stop_rcu(). It
> would be a single place that invokes vhost_set_vring_call().
Your proposal is better, but I'm not sure if something depends on
calling mask(..., false) repeatedly. For example, if guest_notifier
changes.
However, from SVQ point of view we are only interested in avoiding to
set masked notifiers over a vhost already masked: unmasked state will
always incur on a file descriptor change. So I think it should be fine
if we allow unmasking, In other words, allow calling
vhost_set_vring_call(guest_notifier()) repeatedly, so old behavior is
preserved, and only omit the mask(..., true) if the notifier is
already masked, so we can call it unconditionally on
vhost_shadow_vq_start/stop.
Thanks!
- [RFC v2 4/7] vhost: Add VhostShadowVirtqueue, (continued)
- [RFC v2 4/7] vhost: Add VhostShadowVirtqueue, Eugenio Pérez, 2021/02/09
- [RFC v2 5/7] vhost: Add x-vhost-enable-shadow-vq qmp, Eugenio Pérez, 2021/02/09
- [RFC v2 6/7] vhost: Route guest->host notification through shadow virtqueue, Eugenio Pérez, 2021/02/09
- [RFC v2 7/7] vhost: Route host->guest notification through shadow virtqueue, Eugenio Pérez, 2021/02/09
- Re: [RFC v2 0/7] vDPA shadow virtqueue - notifications forwarding, Eugenio Perez Martin, 2021/02/09
- Re: [RFC v2 0/7] vDPA shadow virtqueue - notifications forwarding, no-reply, 2021/02/11