Commit 1d246927 authored by Xie Yongji's avatar Xie Yongji Committed by Michael S. Tsirkin
Browse files

vdpa: Add set/get_vq_affinity callbacks in vdpa_config_ops



This introduces set/get_vq_affinity callbacks in
vdpa_config_ops to support virtqueue affinity
management for vdpa device drivers.

Signed-off-by: default avatarXie Yongji <xieyongji@bytedance.com>
Acked-by: default avatarJason Wang <jasowang@redhat.com>
Message-Id: <20230323053043.35-3-xieyongji@bytedance.com>
Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
parent aaf05948
Loading
Loading
Loading
Loading
+28 −0
Original line number Diff line number Diff line
@@ -337,6 +337,32 @@ static const char *virtio_vdpa_bus_name(struct virtio_device *vdev)
	return dev_name(&vdpa->dev);
}

static int virtio_vdpa_set_vq_affinity(struct virtqueue *vq,
				       const struct cpumask *cpu_mask)
{
	struct virtio_vdpa_device *vd_dev = to_virtio_vdpa_device(vq->vdev);
	struct vdpa_device *vdpa = vd_dev->vdpa;
	const struct vdpa_config_ops *ops = vdpa->config;
	unsigned int index = vq->index;

	if (ops->set_vq_affinity)
		return ops->set_vq_affinity(vdpa, index, cpu_mask);

	return 0;
}

static const struct cpumask *
virtio_vdpa_get_vq_affinity(struct virtio_device *vdev, int index)
{
	struct vdpa_device *vdpa = vd_get_vdpa(vdev);
	const struct vdpa_config_ops *ops = vdpa->config;

	if (ops->get_vq_affinity)
		return ops->get_vq_affinity(vdpa, index);

	return NULL;
}

static const struct virtio_config_ops virtio_vdpa_config_ops = {
	.get		= virtio_vdpa_get,
	.set		= virtio_vdpa_set,
@@ -349,6 +375,8 @@ static const struct virtio_config_ops virtio_vdpa_config_ops = {
	.get_features	= virtio_vdpa_get_features,
	.finalize_features = virtio_vdpa_finalize_features,
	.bus_name	= virtio_vdpa_bus_name,
	.set_vq_affinity = virtio_vdpa_set_vq_affinity,
	.get_vq_affinity = virtio_vdpa_get_vq_affinity,
};

static void virtio_vdpa_release_dev(struct device *_d)
+13 −0
Original line number Diff line number Diff line
@@ -250,6 +250,15 @@ struct vdpa_map_file {
 *				@vdev: vdpa device
 *				Returns the iova range supported by
 *				the device.
 * @set_vq_affinity:		Set the affinity of virtqueue (optional)
 *				@vdev: vdpa device
 *				@idx: virtqueue index
 *				@cpu_mask: the affinity mask
 *				Returns integer: success (0) or error (< 0)
 * @get_vq_affinity:		Get the affinity of virtqueue (optional)
 *				@vdev: vdpa device
 *				@idx: virtqueue index
 *				Returns the affinity mask
 * @set_group_asid:		Set address space identifier for a
 *				virtqueue group (optional)
 *				@vdev: vdpa device
@@ -340,6 +349,10 @@ struct vdpa_config_ops {
			   const void *buf, unsigned int len);
	u32 (*get_generation)(struct vdpa_device *vdev);
	struct vdpa_iova_range (*get_iova_range)(struct vdpa_device *vdev);
	int (*set_vq_affinity)(struct vdpa_device *vdev, u16 idx,
			       const struct cpumask *cpu_mask);
	const struct cpumask *(*get_vq_affinity)(struct vdpa_device *vdev,
						 u16 idx);

	/* DMA ops */
	int (*set_map)(struct vdpa_device *vdev, unsigned int asid,