On Tue, Jan 3, 2023 at 6:51 PM <sebastien.boeuf at intel.com>
wrote:>
> From: Sebastien Boeuf <sebastien.boeuf at intel.com>
>
> Implement resume operation for vdpa_sim devices, so vhost-vdpa will
> offer that backend feature and userspace can effectively resume the
> device.
>
> Signed-off-by: Sebastien Boeuf <sebastien.boeuf at intel.com>
Acked-by: Jason Wang <jasowang at redhat.com>
Thanks
> ---
> drivers/vdpa/vdpa_sim/vdpa_sim.c | 29 +++++++++++++++++++++++++++++
> drivers/vdpa/vdpa_sim/vdpa_sim.h | 1 +
> 2 files changed, 30 insertions(+)
>
> diff --git a/drivers/vdpa/vdpa_sim/vdpa_sim.c
b/drivers/vdpa/vdpa_sim/vdpa_sim.c
> index b071f0d842fb..756a5db0109c 100644
> --- a/drivers/vdpa/vdpa_sim/vdpa_sim.c
> +++ b/drivers/vdpa/vdpa_sim/vdpa_sim.c
> @@ -357,6 +357,12 @@ static void vdpasim_kick_vq(struct vdpa_device *vdpa,
u16 idx)
> struct vdpasim *vdpasim = vdpa_to_sim(vdpa);
> struct vdpasim_virtqueue *vq = &vdpasim->vqs[idx];
>
> + if (!vdpasim->running &&
> + (vdpasim->status & VIRTIO_CONFIG_S_DRIVER_OK)) {
> + vdpasim->pending_kick = true;
> + return;
> + }
> +
> if (vq->ready)
> schedule_work(&vdpasim->work);
> }
> @@ -527,6 +533,27 @@ static int vdpasim_suspend(struct vdpa_device *vdpa)
> return 0;
> }
>
> +static int vdpasim_resume(struct vdpa_device *vdpa)
> +{
> + struct vdpasim *vdpasim = vdpa_to_sim(vdpa);
> + int i;
> +
> + spin_lock(&vdpasim->lock);
> + vdpasim->running = true;
> +
> + if (vdpasim->pending_kick) {
> + /* Process pending descriptors */
> + for (i = 0; i < vdpasim->dev_attr.nvqs; ++i)
> + vdpasim_kick_vq(vdpa, i);
> +
> + vdpasim->pending_kick = false;
> + }
> +
> + spin_unlock(&vdpasim->lock);
> +
> + return 0;
> +}
> +
> static size_t vdpasim_get_config_size(struct vdpa_device *vdpa)
> {
> struct vdpasim *vdpasim = vdpa_to_sim(vdpa);
> @@ -717,6 +744,7 @@ static const struct vdpa_config_ops vdpasim_config_ops
= {
> .set_status = vdpasim_set_status,
> .reset = vdpasim_reset,
> .suspend = vdpasim_suspend,
> + .resume = vdpasim_resume,
> .get_config_size = vdpasim_get_config_size,
> .get_config = vdpasim_get_config,
> .set_config = vdpasim_set_config,
> @@ -750,6 +778,7 @@ static const struct vdpa_config_ops
vdpasim_batch_config_ops = {
> .set_status = vdpasim_set_status,
> .reset = vdpasim_reset,
> .suspend = vdpasim_suspend,
> + .resume = vdpasim_resume,
> .get_config_size = vdpasim_get_config_size,
> .get_config = vdpasim_get_config,
> .set_config = vdpasim_set_config,
> diff --git a/drivers/vdpa/vdpa_sim/vdpa_sim.h
b/drivers/vdpa/vdpa_sim/vdpa_sim.h
> index 0e78737dcc16..a745605589e2 100644
> --- a/drivers/vdpa/vdpa_sim/vdpa_sim.h
> +++ b/drivers/vdpa/vdpa_sim/vdpa_sim.h
> @@ -67,6 +67,7 @@ struct vdpasim {
> u64 features;
> u32 groups;
> bool running;
> + bool pending_kick;
> /* spinlock to synchronize iommu table */
> spinlock_t iommu_lock;
> };
> --
> 2.37.2
>
> ---------------------------------------------------------------------
> 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.
>