On Wed, Apr 22, 2020 at 12:17:50PM -0400, Raphael Norwitz wrote:
> There are some problems with this patch. It doesn't apply cleanly.
> 
> Are you sure you’re developing on an up to date master branch?
> 
> On Thu, Apr 23, 2020 at 09:39:36PM +0300, Dima Stepanov wrote:
> > 
> > In case of the vhost-user devices the daemon can be killed at any
> > moment. Since QEMU supports the reconnet functionality the guest
> > notifiers should be reset and disabled after "disconnect" event. The
> > most issues were found if the "disconnect" event happened during vhost
> > device initialization step.
> > The disconnect event leads to the call of the vhost_dev_cleanup()
> > routine. Which memset to 0 a vhost device structure. Because of this, if
> > device was not started (dev.started == false) and the connection is
> > broken, then the set_guest_notifier method will produce assertion error.
> > Also connection can be broken after the dev.started field is set to
> > true.
> > A new notifiers_set field is added to the vhost_dev structure to track
> > the state of the guest notifiers during the initialization process.
> > 
> > Signed-off-by: Dima Stepanov <dimas...@yandex-team.ru>
> > ---
> >  hw/block/vhost-user-blk.c |  8 ++++----
> >  hw/virtio/vhost.c         | 11 +++++++++++
> >  include/hw/virtio/vhost.h |  1 +
> >  3 files changed, 16 insertions(+), 4 deletions(-)
> > 
> >  @@ -1417,6 +1422,8 @@ void vhost_dev_disable_notifiers(struct vhost_dev 
> > *hdev, VirtIODevice *vdev)
> 
> I can’t find the function vhost_dev_drop_guest_notifiers() in
> /hw/virtio/vhost.c, or anywhere in the codebase.
> 
> Where does this code come from?

These wrapper functions were introduced in this patch set with the
previous patch:
  [RFC PATCH v1 4/7] vhost: introduce wrappers to set guest notifiers for
virtio device
The problem was found in the vhost-user-blk stack. But it seems to me
that it is the same for all vhost-user devices. That is why i've tried
to suggest solution which will resolve other vhost-user devices, too.
And this was the reason to add new wrappers.

> 
> >          virtio_bus_cleanup_host_notifier(VIRTIO_BUS(qbus), hdev->vq_index 
> > + i);
> >      }
> >      virtio_device_release_ioeventfd(vdev);
> > +
> > +    hdev->notifiers_set = false;
> >  }
> >  
> >  /*
> > @@ -1449,6 +1456,10 @@ int vhost_dev_drop_guest_notifiers(struct vhost_dev 
> > *hdev,
> >      VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
> >      int ret;
> >  
> > +    if (!hdev->notifiers_set) {
> > +        return 0;
> > +    }
> > +
> >      ret = k->set_guest_notifiers(qbus->parent, nvqs, false);
> >      if (ret < 0) {
> >          error_report("Error reset guest notifier: %d", -ret);
> > diff --git a/include/hw/virtio/vhost.h b/include/hw/virtio/vhost.h
> > index 4d0d2e2..e3711a7 100644
> > --- a/include/hw/virtio/vhost.h
> > +++ b/include/hw/virtio/vhost.h
> > @@ -90,6 +90,7 @@ struct vhost_dev {
> >      QLIST_HEAD(, vhost_iommu) iommu_list;
> >      IOMMUNotifier n;
> >      const VhostDevConfigOps *config_ops;
> > +    bool notifiers_set;
> >  };
> >  
> >  int vhost_dev_init(struct vhost_dev *hdev, void *opaque,
> > -- 
> > 2.7.4
> > 
> > 

Reply via email to