Message ID | 1625589956-81651-19-git-send-email-steven.sistare@oracle.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Live Update | expand |
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 <mark.kanda@oracle.com> > Signed-off-by: Steve Sistare <steven.sistare@oracle.com> Makes sense superficially. Acked-by: Michael S. Tsirkin <mst@redhat.com> 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
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); }