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