On Tue, Jul 06, 2021 at 09:45:49AM -0700, Steve Sistare wrote: > A vhost device is implicitly preserved across re-exec because its fd is not > closed, and the value of the fd is specified on the command line for the > new qemu to find. However, new qemu issues an VHOST_RESET_OWNER ioctl, > which fails because the device already has an owner. To fix, reset the > owner prior to exec. > > Signed-off-by: Mark Kanda <[email protected]> > Signed-off-by: Steve Sistare <[email protected]>
Makes sense superficially. Acked-by: Michael S. Tsirkin <[email protected]> I didn't really read the series deeply enough to just the rest of it. > --- > hw/virtio/vhost.c | 11 +++++++++++ > include/hw/virtio/vhost.h | 1 + > migration/cpr.c | 1 + > 3 files changed, 13 insertions(+) > > diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c > index e2163a0..8c0c9c3 100644 > --- a/hw/virtio/vhost.c > +++ b/hw/virtio/vhost.c > @@ -1820,6 +1820,17 @@ void vhost_dev_stop(struct vhost_dev *hdev, > VirtIODevice *vdev) > hdev->vdev = NULL; > } > > +void vhost_dev_reset_all(void) > +{ > + struct vhost_dev *dev; > + > + QLIST_FOREACH(dev, &vhost_devices, entry) { > + if (dev->vhost_ops->vhost_reset_device(dev) < 0) { > + VHOST_OPS_DEBUG("vhost_reset_device failed"); > + } > + } > +} > + > int vhost_net_set_backend(struct vhost_dev *hdev, > struct vhost_vring_file *file) > { > diff --git a/include/hw/virtio/vhost.h b/include/hw/virtio/vhost.h > index 4a8bc75..71704d4 100644 > --- a/include/hw/virtio/vhost.h > +++ b/include/hw/virtio/vhost.h > @@ -106,6 +106,7 @@ int vhost_dev_init(struct vhost_dev *hdev, void *opaque, > void vhost_dev_cleanup(struct vhost_dev *hdev); > int vhost_dev_start(struct vhost_dev *hdev, VirtIODevice *vdev); > void vhost_dev_stop(struct vhost_dev *hdev, VirtIODevice *vdev); > +void vhost_dev_reset_all(void); > int vhost_dev_enable_notifiers(struct vhost_dev *hdev, VirtIODevice *vdev); > void vhost_dev_disable_notifiers(struct vhost_dev *hdev, VirtIODevice *vdev); > > diff --git a/migration/cpr.c b/migration/cpr.c > index 578466c..6333988 100644 > --- a/migration/cpr.c > +++ b/migration/cpr.c > @@ -142,6 +142,7 @@ void cprexec(strList *args, Error **errp) > return; > } > walkenv(FD_PREFIX, preserve_fd, 0); > + vhost_dev_reset_all(); > qemu_system_exec_request(args); > } > > -- > 1.8.3.1
