Commit f9d9f57e authored by Sebastien Boeuf's avatar Sebastien Boeuf Committed by Michael S. Tsirkin
Browse files

vdpa_sim: Implement resume vdpa op



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: default avatarSebastien Boeuf <sebastien.boeuf@intel.com>
Message-Id: <15a4566826033c5dd9a2167e5cfb0ef4d90cea49.1672742878.git.sebastien.boeuf@intel.com>
Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
Acked-by: default avatarJason Wang <jasowang@redhat.com>
parent 3b688d7a
Loading
Loading
Loading
Loading
+29 −0
Original line number Diff line number Diff line
@@ -358,6 +358,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);
}
@@ -528,6 +534,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);
@@ -720,6 +747,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,
@@ -753,6 +781,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,
+1 −0
Original line number Diff line number Diff line
@@ -67,6 +67,7 @@ struct vdpasim {
	u64 features;
	u32 groups;
	bool running;
	bool pending_kick;
	/* spinlock to synchronize iommu table */
	spinlock_t iommu_lock;
};