On Fri, Oct 14, 2022 at 7:15 PM <sebastien.boeuf at intel.com>
wrote:>
> From: Sebastien Boeuf <sebastien.boeuf at intel.com>
>
> This new ioctl adds support for resuming the device from userspace.
>
> This is required when trying to restore the device in a functioning
> state after it's been suspended. It is already possible to reset a
> suspended device,
Nit: And should we allow resume a non suspended device? Do we need to
document this requirement somewhere?
> but that means the device must be reconfigured and
> all the IOMMU/IOTLB mappings must be recreated. This new operation
> allows the device to be resumed without going through a full reset.
>
> This is particularly useful when trying to perform offline migration of
> a virtual machine (also known as snapshot/restore) as it allows the VMM
> to resume the virtual machine back to a running state after the snapshot
> is performed.
>
> Signed-off-by: Sebastien Boeuf <sebastien.boeuf at intel.com>
Acked-by: Jason Wang <jasowang at redhat.com>
> ---
> drivers/vhost/vdpa.c | 18 ++++++++++++++++++
> include/uapi/linux/vhost.h | 8 ++++++++
> 2 files changed, 26 insertions(+)
>
> diff --git a/drivers/vhost/vdpa.c b/drivers/vhost/vdpa.c
> index 833617d00ef6..1db7bd39fb63 100644
> --- a/drivers/vhost/vdpa.c
> +++ b/drivers/vhost/vdpa.c
> @@ -502,6 +502,21 @@ static long vhost_vdpa_suspend(struct vhost_vdpa *v)
> return ops->suspend(vdpa);
> }
>
> +/* After a successful return of this ioctl the device resumes processing
> + * virtqueue descriptors. The device becomes fully operational the same
way it
> + * was before it was suspended.
> + */
> +static long vhost_vdpa_resume(struct vhost_vdpa *v)
> +{
> + struct vdpa_device *vdpa = v->vdpa;
> + const struct vdpa_config_ops *ops = vdpa->config;
> +
> + if (!ops->resume)
> + return -EOPNOTSUPP;
> +
> + return ops->resume(vdpa);
> +}
> +
> static long vhost_vdpa_vring_ioctl(struct vhost_vdpa *v, unsigned int cmd,
> void __user *argp)
> {
> @@ -687,6 +702,9 @@ static long vhost_vdpa_unlocked_ioctl(struct file
*filep,
> case VHOST_VDPA_SUSPEND:
> r = vhost_vdpa_suspend(v);
> break;
> + case VHOST_VDPA_RESUME:
> + r = vhost_vdpa_resume(v);
> + break;
> default:
> r = vhost_dev_ioctl(&v->vdev, cmd, argp);
> if (r == -ENOIOCTLCMD)
> diff --git a/include/uapi/linux/vhost.h b/include/uapi/linux/vhost.h
> index f9f115a7c75b..92e1b700b51c 100644
> --- a/include/uapi/linux/vhost.h
> +++ b/include/uapi/linux/vhost.h
> @@ -180,4 +180,12 @@
> */
> #define VHOST_VDPA_SUSPEND _IO(VHOST_VIRTIO, 0x7D)
>
> +/* Resume a device so it can resume processing virtqueue requests
> + *
> + * After the return of this ioctl the device will have restored all the
> + * necessary states and it is fully operational to continue processing the
> + * virtqueue descriptors.
> + */
> +#define VHOST_VDPA_RESUME _IO(VHOST_VIRTIO, 0x7E)
> +
> #endif
> --
> 2.34.1
>
> ---------------------------------------------------------------------
> Intel Corporation SAS (French simplified joint stock company)
> Registered headquarters: "Les Montalets"- 2, rue de Paris,
> 92196 Meudon Cedex, France
> Registration Number: 302 456 199 R.C.S. NANTERRE
> Capital: 5 208 026.16 Euros
>
> This e-mail and any attachments may contain confidential material for
> the sole use of the intended recipient(s). Any review or distribution
> by others is strictly prohibited. If you are not the intended
> recipient, please contact the sender and delete all copies.
>