Commit d4821902 authored by Gautam Dawar's avatar Gautam Dawar Committed by Michael S. Tsirkin

vdpa: introduce virtqueue groups

This patch introduces virtqueue groups to vDPA device. The virtqueue
group is the minimal set of virtqueues that must share an address
space. And the address space identifier could only be attached to
a specific virtqueue group.
Signed-off-by: default avatarJason Wang <jasowang@redhat.com>
Signed-off-by: default avatarGautam Dawar <gdawar@xilinx.com>
Message-Id: <20220330180436.24644-6-gdawar@xilinx.com>
Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
parent 0b7ee47c
...@@ -470,7 +470,7 @@ static int eni_vdpa_probe(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -470,7 +470,7 @@ static int eni_vdpa_probe(struct pci_dev *pdev, const struct pci_device_id *id)
return ret; return ret;
eni_vdpa = vdpa_alloc_device(struct eni_vdpa, vdpa, eni_vdpa = vdpa_alloc_device(struct eni_vdpa, vdpa,
dev, &eni_vdpa_ops, NULL, false); dev, &eni_vdpa_ops, 1, NULL, false);
if (IS_ERR(eni_vdpa)) { if (IS_ERR(eni_vdpa)) {
ENI_ERR(pdev, "failed to allocate vDPA structure\n"); ENI_ERR(pdev, "failed to allocate vDPA structure\n");
return PTR_ERR(eni_vdpa); return PTR_ERR(eni_vdpa);
......
...@@ -626,6 +626,11 @@ static size_t ifcvf_vdpa_get_config_size(struct vdpa_device *vdpa_dev) ...@@ -626,6 +626,11 @@ static size_t ifcvf_vdpa_get_config_size(struct vdpa_device *vdpa_dev)
return vf->config_size; return vf->config_size;
} }
static u32 ifcvf_vdpa_get_vq_group(struct vdpa_device *vdpa, u16 idx)
{
return 0;
}
static void ifcvf_vdpa_get_config(struct vdpa_device *vdpa_dev, static void ifcvf_vdpa_get_config(struct vdpa_device *vdpa_dev,
unsigned int offset, unsigned int offset,
void *buf, unsigned int len) void *buf, unsigned int len)
...@@ -704,6 +709,7 @@ static const struct vdpa_config_ops ifc_vdpa_ops = { ...@@ -704,6 +709,7 @@ static const struct vdpa_config_ops ifc_vdpa_ops = {
.get_device_id = ifcvf_vdpa_get_device_id, .get_device_id = ifcvf_vdpa_get_device_id,
.get_vendor_id = ifcvf_vdpa_get_vendor_id, .get_vendor_id = ifcvf_vdpa_get_vendor_id,
.get_vq_align = ifcvf_vdpa_get_vq_align, .get_vq_align = ifcvf_vdpa_get_vq_align,
.get_vq_group = ifcvf_vdpa_get_vq_group,
.get_config_size = ifcvf_vdpa_get_config_size, .get_config_size = ifcvf_vdpa_get_config_size,
.get_config = ifcvf_vdpa_get_config, .get_config = ifcvf_vdpa_get_config,
.set_config = ifcvf_vdpa_set_config, .set_config = ifcvf_vdpa_set_config,
...@@ -758,7 +764,7 @@ static int ifcvf_vdpa_dev_add(struct vdpa_mgmt_dev *mdev, const char *name, ...@@ -758,7 +764,7 @@ static int ifcvf_vdpa_dev_add(struct vdpa_mgmt_dev *mdev, const char *name,
pdev = ifcvf_mgmt_dev->pdev; pdev = ifcvf_mgmt_dev->pdev;
dev = &pdev->dev; dev = &pdev->dev;
adapter = vdpa_alloc_device(struct ifcvf_adapter, vdpa, adapter = vdpa_alloc_device(struct ifcvf_adapter, vdpa,
dev, &ifc_vdpa_ops, name, false); dev, &ifc_vdpa_ops, 1, name, false);
if (IS_ERR(adapter)) { if (IS_ERR(adapter)) {
IFCVF_ERR(pdev, "Failed to allocate vDPA structure"); IFCVF_ERR(pdev, "Failed to allocate vDPA structure");
return PTR_ERR(adapter); return PTR_ERR(adapter);
......
...@@ -1947,6 +1947,11 @@ static u32 mlx5_vdpa_get_vq_align(struct vdpa_device *vdev) ...@@ -1947,6 +1947,11 @@ static u32 mlx5_vdpa_get_vq_align(struct vdpa_device *vdev)
return PAGE_SIZE; return PAGE_SIZE;
} }
static u32 mlx5_vdpa_get_vq_group(struct vdpa_device *vdpa, u16 idx)
{
return 0;
}
enum { MLX5_VIRTIO_NET_F_GUEST_CSUM = 1 << 9, enum { MLX5_VIRTIO_NET_F_GUEST_CSUM = 1 << 9,
MLX5_VIRTIO_NET_F_CSUM = 1 << 10, MLX5_VIRTIO_NET_F_CSUM = 1 << 10,
MLX5_VIRTIO_NET_F_HOST_TSO6 = 1 << 11, MLX5_VIRTIO_NET_F_HOST_TSO6 = 1 << 11,
...@@ -2582,6 +2587,7 @@ static const struct vdpa_config_ops mlx5_vdpa_ops = { ...@@ -2582,6 +2587,7 @@ static const struct vdpa_config_ops mlx5_vdpa_ops = {
.get_vq_notification = mlx5_get_vq_notification, .get_vq_notification = mlx5_get_vq_notification,
.get_vq_irq = mlx5_get_vq_irq, .get_vq_irq = mlx5_get_vq_irq,
.get_vq_align = mlx5_vdpa_get_vq_align, .get_vq_align = mlx5_vdpa_get_vq_align,
.get_vq_group = mlx5_vdpa_get_vq_group,
.get_device_features = mlx5_vdpa_get_device_features, .get_device_features = mlx5_vdpa_get_device_features,
.set_driver_features = mlx5_vdpa_set_driver_features, .set_driver_features = mlx5_vdpa_set_driver_features,
.get_driver_features = mlx5_vdpa_get_driver_features, .get_driver_features = mlx5_vdpa_get_driver_features,
...@@ -2817,7 +2823,7 @@ static int mlx5_vdpa_dev_add(struct vdpa_mgmt_dev *v_mdev, const char *name, ...@@ -2817,7 +2823,7 @@ static int mlx5_vdpa_dev_add(struct vdpa_mgmt_dev *v_mdev, const char *name,
} }
ndev = vdpa_alloc_device(struct mlx5_vdpa_net, mvdev.vdev, mdev->device, &mlx5_vdpa_ops, ndev = vdpa_alloc_device(struct mlx5_vdpa_net, mvdev.vdev, mdev->device, &mlx5_vdpa_ops,
name, false); 1, name, false);
if (IS_ERR(ndev)) if (IS_ERR(ndev))
return PTR_ERR(ndev); return PTR_ERR(ndev);
......
...@@ -158,6 +158,7 @@ static void vdpa_release_dev(struct device *d) ...@@ -158,6 +158,7 @@ static void vdpa_release_dev(struct device *d)
* initialized but before registered. * initialized but before registered.
* @parent: the parent device * @parent: the parent device
* @config: the bus operations that is supported by this device * @config: the bus operations that is supported by this device
* @ngroups: number of groups supported by this device
* @size: size of the parent structure that contains private data * @size: size of the parent structure that contains private data
* @name: name of the vdpa device; optional. * @name: name of the vdpa device; optional.
* @use_va: indicate whether virtual address must be used by this device * @use_va: indicate whether virtual address must be used by this device
...@@ -170,6 +171,7 @@ static void vdpa_release_dev(struct device *d) ...@@ -170,6 +171,7 @@ static void vdpa_release_dev(struct device *d)
*/ */
struct vdpa_device *__vdpa_alloc_device(struct device *parent, struct vdpa_device *__vdpa_alloc_device(struct device *parent,
const struct vdpa_config_ops *config, const struct vdpa_config_ops *config,
unsigned int ngroups,
size_t size, const char *name, size_t size, const char *name,
bool use_va) bool use_va)
{ {
...@@ -202,6 +204,7 @@ struct vdpa_device *__vdpa_alloc_device(struct device *parent, ...@@ -202,6 +204,7 @@ struct vdpa_device *__vdpa_alloc_device(struct device *parent,
vdev->config = config; vdev->config = config;
vdev->features_valid = false; vdev->features_valid = false;
vdev->use_va = use_va; vdev->use_va = use_va;
vdev->ngroups = ngroups;
if (name) if (name)
err = dev_set_name(&vdev->dev, "%s", name); err = dev_set_name(&vdev->dev, "%s", name);
......
...@@ -250,7 +250,7 @@ struct vdpasim *vdpasim_create(struct vdpasim_dev_attr *dev_attr) ...@@ -250,7 +250,7 @@ struct vdpasim *vdpasim_create(struct vdpasim_dev_attr *dev_attr)
else else
ops = &vdpasim_config_ops; ops = &vdpasim_config_ops;
vdpasim = vdpa_alloc_device(struct vdpasim, vdpa, NULL, ops, vdpasim = vdpa_alloc_device(struct vdpasim, vdpa, NULL, ops, 1,
dev_attr->name, false); dev_attr->name, false);
if (IS_ERR(vdpasim)) { if (IS_ERR(vdpasim)) {
ret = PTR_ERR(vdpasim); ret = PTR_ERR(vdpasim);
...@@ -399,6 +399,11 @@ static u32 vdpasim_get_vq_align(struct vdpa_device *vdpa) ...@@ -399,6 +399,11 @@ static u32 vdpasim_get_vq_align(struct vdpa_device *vdpa)
return VDPASIM_QUEUE_ALIGN; return VDPASIM_QUEUE_ALIGN;
} }
static u32 vdpasim_get_vq_group(struct vdpa_device *vdpa, u16 idx)
{
return 0;
}
static u64 vdpasim_get_device_features(struct vdpa_device *vdpa) static u64 vdpasim_get_device_features(struct vdpa_device *vdpa)
{ {
struct vdpasim *vdpasim = vdpa_to_sim(vdpa); struct vdpasim *vdpasim = vdpa_to_sim(vdpa);
...@@ -620,6 +625,7 @@ static const struct vdpa_config_ops vdpasim_config_ops = { ...@@ -620,6 +625,7 @@ static const struct vdpa_config_ops vdpasim_config_ops = {
.set_vq_state = vdpasim_set_vq_state, .set_vq_state = vdpasim_set_vq_state,
.get_vq_state = vdpasim_get_vq_state, .get_vq_state = vdpasim_get_vq_state,
.get_vq_align = vdpasim_get_vq_align, .get_vq_align = vdpasim_get_vq_align,
.get_vq_group = vdpasim_get_vq_group,
.get_device_features = vdpasim_get_device_features, .get_device_features = vdpasim_get_device_features,
.set_driver_features = vdpasim_set_driver_features, .set_driver_features = vdpasim_set_driver_features,
.get_driver_features = vdpasim_get_driver_features, .get_driver_features = vdpasim_get_driver_features,
...@@ -650,6 +656,7 @@ static const struct vdpa_config_ops vdpasim_batch_config_ops = { ...@@ -650,6 +656,7 @@ static const struct vdpa_config_ops vdpasim_batch_config_ops = {
.set_vq_state = vdpasim_set_vq_state, .set_vq_state = vdpasim_set_vq_state,
.get_vq_state = vdpasim_get_vq_state, .get_vq_state = vdpasim_get_vq_state,
.get_vq_align = vdpasim_get_vq_align, .get_vq_align = vdpasim_get_vq_align,
.get_vq_group = vdpasim_get_vq_group,
.get_device_features = vdpasim_get_device_features, .get_device_features = vdpasim_get_device_features,
.set_driver_features = vdpasim_set_driver_features, .set_driver_features = vdpasim_set_driver_features,
.get_driver_features = vdpasim_get_driver_features, .get_driver_features = vdpasim_get_driver_features,
......
...@@ -63,6 +63,7 @@ struct vdpasim { ...@@ -63,6 +63,7 @@ struct vdpasim {
u32 status; u32 status;
u32 generation; u32 generation;
u64 features; u64 features;
u32 groups;
/* spinlock to synchronize iommu table */ /* spinlock to synchronize iommu table */
spinlock_t iommu_lock; spinlock_t iommu_lock;
}; };
......
...@@ -1495,7 +1495,7 @@ static int vduse_dev_init_vdpa(struct vduse_dev *dev, const char *name) ...@@ -1495,7 +1495,7 @@ static int vduse_dev_init_vdpa(struct vduse_dev *dev, const char *name)
return -EEXIST; return -EEXIST;
vdev = vdpa_alloc_device(struct vduse_vdpa, vdpa, dev->dev, vdev = vdpa_alloc_device(struct vduse_vdpa, vdpa, dev->dev,
&vduse_vdpa_config_ops, name, true); &vduse_vdpa_config_ops, 1, name, true);
if (IS_ERR(vdev)) if (IS_ERR(vdev))
return PTR_ERR(vdev); return PTR_ERR(vdev);
......
...@@ -466,7 +466,7 @@ static int vp_vdpa_probe(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -466,7 +466,7 @@ static int vp_vdpa_probe(struct pci_dev *pdev, const struct pci_device_id *id)
return ret; return ret;
vp_vdpa = vdpa_alloc_device(struct vp_vdpa, vdpa, vp_vdpa = vdpa_alloc_device(struct vp_vdpa, vdpa,
dev, &vp_vdpa_ops, NULL, false); dev, &vp_vdpa_ops, 1, NULL, false);
if (IS_ERR(vp_vdpa)) { if (IS_ERR(vp_vdpa)) {
dev_err(dev, "vp_vdpa: Failed to allocate vDPA structure\n"); dev_err(dev, "vp_vdpa: Failed to allocate vDPA structure\n");
return PTR_ERR(vp_vdpa); return PTR_ERR(vp_vdpa);
......
...@@ -85,6 +85,7 @@ struct vdpa_device { ...@@ -85,6 +85,7 @@ struct vdpa_device {
bool use_va; bool use_va;
u32 nvqs; u32 nvqs;
struct vdpa_mgmt_dev *mdev; struct vdpa_mgmt_dev *mdev;
unsigned int ngroups;
}; };
/** /**
...@@ -172,6 +173,10 @@ struct vdpa_map_file { ...@@ -172,6 +173,10 @@ struct vdpa_map_file {
* for the device * for the device
* @vdev: vdpa device * @vdev: vdpa device
* Returns virtqueue algin requirement * Returns virtqueue algin requirement
* @get_vq_group: Get the group id for a specific virtqueue
* @vdev: vdpa device
* @idx: virtqueue index
* Returns u32: group id for this virtqueue
* @get_device_features: Get virtio features supported by the device * @get_device_features: Get virtio features supported by the device
* @vdev: vdpa device * @vdev: vdpa device
* Returns the virtio features support by the * Returns the virtio features support by the
...@@ -286,6 +291,7 @@ struct vdpa_config_ops { ...@@ -286,6 +291,7 @@ struct vdpa_config_ops {
/* Device ops */ /* Device ops */
u32 (*get_vq_align)(struct vdpa_device *vdev); u32 (*get_vq_align)(struct vdpa_device *vdev);
u32 (*get_vq_group)(struct vdpa_device *vdev, u16 idx);
u64 (*get_device_features)(struct vdpa_device *vdev); u64 (*get_device_features)(struct vdpa_device *vdev);
int (*set_driver_features)(struct vdpa_device *vdev, u64 features); int (*set_driver_features)(struct vdpa_device *vdev, u64 features);
u64 (*get_driver_features)(struct vdpa_device *vdev); u64 (*get_driver_features)(struct vdpa_device *vdev);
...@@ -318,6 +324,7 @@ struct vdpa_config_ops { ...@@ -318,6 +324,7 @@ struct vdpa_config_ops {
struct vdpa_device *__vdpa_alloc_device(struct device *parent, struct vdpa_device *__vdpa_alloc_device(struct device *parent,
const struct vdpa_config_ops *config, const struct vdpa_config_ops *config,
unsigned int ngroups,
size_t size, const char *name, size_t size, const char *name,
bool use_va); bool use_va);
...@@ -328,17 +335,18 @@ struct vdpa_device *__vdpa_alloc_device(struct device *parent, ...@@ -328,17 +335,18 @@ struct vdpa_device *__vdpa_alloc_device(struct device *parent,
* @member: the name of struct vdpa_device within the @dev_struct * @member: the name of struct vdpa_device within the @dev_struct
* @parent: the parent device * @parent: the parent device
* @config: the bus operations that is supported by this device * @config: the bus operations that is supported by this device
* @ngroups: the number of virtqueue groups supported by this device
* @name: name of the vdpa device * @name: name of the vdpa device
* @use_va: indicate whether virtual address must be used by this device * @use_va: indicate whether virtual address must be used by this device
* *
* Return allocated data structure or ERR_PTR upon error * Return allocated data structure or ERR_PTR upon error
*/ */
#define vdpa_alloc_device(dev_struct, member, parent, config, name, use_va) \ #define vdpa_alloc_device(dev_struct, member, parent, config, ngroups, name, use_va) \
container_of(__vdpa_alloc_device( \ container_of((__vdpa_alloc_device( \
parent, config, \ parent, config, ngroups, \
sizeof(dev_struct) + \ sizeof(dev_struct) + \
BUILD_BUG_ON_ZERO(offsetof( \ BUILD_BUG_ON_ZERO(offsetof( \
dev_struct, member)), name, use_va), \ dev_struct, member)), name, use_va)), \
dev_struct, member) dev_struct, member)
int vdpa_register_device(struct vdpa_device *vdev, u32 nvqs); int vdpa_register_device(struct vdpa_device *vdev, u32 nvqs);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment