]> git.baikalelectronics.ru Git - kernel.git/commitdiff
vdpa: introduce virtqueue groups
authorGautam Dawar <gautam.dawar@xilinx.com>
Wed, 30 Mar 2022 18:03:45 +0000 (23:33 +0530)
committerMichael S. Tsirkin <mst@redhat.com>
Tue, 31 May 2022 16:44:27 +0000 (12:44 -0400)
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: Jason Wang <jasowang@redhat.com>
Signed-off-by: Gautam Dawar <gdawar@xilinx.com>
Message-Id: <20220330180436.24644-6-gdawar@xilinx.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
drivers/vdpa/alibaba/eni_vdpa.c
drivers/vdpa/ifcvf/ifcvf_main.c
drivers/vdpa/mlx5/net/mlx5_vnet.c
drivers/vdpa/vdpa.c
drivers/vdpa/vdpa_sim/vdpa_sim.c
drivers/vdpa/vdpa_sim/vdpa_sim.h
drivers/vdpa/vdpa_user/vduse_dev.c
drivers/vdpa/virtio_pci/vp_vdpa.c
include/linux/vdpa.h

index f480d54f308cdf0ef4a4afd3a203dd051a7376ec..3e93c5eb0cf9ebfaeb4b800d9c9d12842e389715 100644 (file)
@@ -470,7 +470,7 @@ static int eni_vdpa_probe(struct pci_dev *pdev, const struct pci_device_id *id)
                return ret;
 
        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)) {
                ENI_ERR(pdev, "failed to allocate vDPA structure\n");
                return PTR_ERR(eni_vdpa);
index 4366320fb68d3140c63b8c7cd00e93b14cab1a9e..fde33e1432461859ed21d01150d43b5af19878a4 100644 (file)
@@ -626,6 +626,11 @@ static size_t ifcvf_vdpa_get_config_size(struct vdpa_device *vdpa_dev)
        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,
                                  unsigned int offset,
                                  void *buf, unsigned int len)
@@ -704,6 +709,7 @@ static const struct vdpa_config_ops ifc_vdpa_ops = {
        .get_device_id  = ifcvf_vdpa_get_device_id,
        .get_vendor_id  = ifcvf_vdpa_get_vendor_id,
        .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     = ifcvf_vdpa_get_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,
        pdev = ifcvf_mgmt_dev->pdev;
        dev = &pdev->dev;
        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)) {
                IFCVF_ERR(pdev, "Failed to allocate vDPA structure");
                return PTR_ERR(adapter);
index 57cfc64248b7819f71ffe6bc8e6f24feed031659..5647e12056d882511f9bd8e5537665ad1d41836f 100644 (file)
@@ -1947,6 +1947,11 @@ static u32 mlx5_vdpa_get_vq_align(struct vdpa_device *vdev)
        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,
        MLX5_VIRTIO_NET_F_CSUM = 1 << 10,
        MLX5_VIRTIO_NET_F_HOST_TSO6 = 1 << 11,
@@ -2582,6 +2587,7 @@ static const struct vdpa_config_ops mlx5_vdpa_ops = {
        .get_vq_notification = mlx5_get_vq_notification,
        .get_vq_irq = mlx5_get_vq_irq,
        .get_vq_align = mlx5_vdpa_get_vq_align,
+       .get_vq_group = mlx5_vdpa_get_vq_group,
        .get_device_features = mlx5_vdpa_get_device_features,
        .set_driver_features = mlx5_vdpa_set_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,
        }
 
        ndev = vdpa_alloc_device(struct mlx5_vdpa_net, mvdev.vdev, mdev->device, &mlx5_vdpa_ops,
-                                name, false);
+                                1, name, false);
        if (IS_ERR(ndev))
                return PTR_ERR(ndev);
 
index 9d3534a0bc5f57a6b46f39675257e22d8bb873cf..4ca54779be2cd70225f5aea1541077920598c0d9 100644 (file)
@@ -158,6 +158,7 @@ static void vdpa_release_dev(struct device *d)
  * initialized but before registered.
  * @parent: the parent 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
  * @name: name of the vdpa device; optional.
  * @use_va: indicate whether virtual address must be used by this device
@@ -170,6 +171,7 @@ static void vdpa_release_dev(struct device *d)
  */
 struct vdpa_device *__vdpa_alloc_device(struct device *parent,
                                        const struct vdpa_config_ops *config,
+                                       unsigned int ngroups,
                                        size_t size, const char *name,
                                        bool use_va)
 {
@@ -202,6 +204,7 @@ struct vdpa_device *__vdpa_alloc_device(struct device *parent,
        vdev->config = config;
        vdev->features_valid = false;
        vdev->use_va = use_va;
+       vdev->ngroups = ngroups;
 
        if (name)
                err = dev_set_name(&vdev->dev, "%s", name);
index ddbe142af09aedd204577e30a77a882d82b704fd..c98cb1f869faab700c382188fa7e2d30d52699e6 100644 (file)
@@ -250,7 +250,7 @@ struct vdpasim *vdpasim_create(struct vdpasim_dev_attr *dev_attr)
        else
                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);
        if (IS_ERR(vdpasim)) {
                ret = PTR_ERR(vdpasim);
@@ -399,6 +399,11 @@ static u32 vdpasim_get_vq_align(struct vdpa_device *vdpa)
        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)
 {
        struct vdpasim *vdpasim = vdpa_to_sim(vdpa);
@@ -620,6 +625,7 @@ static const struct vdpa_config_ops vdpasim_config_ops = {
        .set_vq_state           = vdpasim_set_vq_state,
        .get_vq_state           = vdpasim_get_vq_state,
        .get_vq_align           = vdpasim_get_vq_align,
+       .get_vq_group           = vdpasim_get_vq_group,
        .get_device_features    = vdpasim_get_device_features,
        .set_driver_features    = vdpasim_set_driver_features,
        .get_driver_features    = vdpasim_get_driver_features,
@@ -650,6 +656,7 @@ static const struct vdpa_config_ops vdpasim_batch_config_ops = {
        .set_vq_state           = vdpasim_set_vq_state,
        .get_vq_state           = vdpasim_get_vq_state,
        .get_vq_align           = vdpasim_get_vq_align,
+       .get_vq_group           = vdpasim_get_vq_group,
        .get_device_features    = vdpasim_get_device_features,
        .set_driver_features    = vdpasim_set_driver_features,
        .get_driver_features    = vdpasim_get_driver_features,
index cd58e888bcf3b15ed9c650379bbf8a3f1e7b12df..0be7c1e7ef803682b75285b4d1698d1d5d69c877 100644 (file)
@@ -63,6 +63,7 @@ struct vdpasim {
        u32 status;
        u32 generation;
        u64 features;
+       u32 groups;
        /* spinlock to synchronize iommu table */
        spinlock_t iommu_lock;
 };
index f85d1a08ed87c2ecef941d49fbfe41dac37554f3..4ee6850b9a689ebb6905a1ed72540e96f50155d6 100644 (file)
@@ -1495,7 +1495,7 @@ static int vduse_dev_init_vdpa(struct vduse_dev *dev, const char *name)
                return -EEXIST;
 
        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))
                return PTR_ERR(vdev);
 
index cce101e6a940e52432400c45d7c59477f1ae3a05..e18dfe9939015be27cceb8de10a92f5cb9475c34 100644 (file)
@@ -466,7 +466,7 @@ static int vp_vdpa_probe(struct pci_dev *pdev, const struct pci_device_id *id)
                return ret;
 
        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)) {
                dev_err(dev, "vp_vdpa: Failed to allocate vDPA structure\n");
                return PTR_ERR(vp_vdpa);
index 2cb14847831e18d2084fe3ff1f4adf9d7734ebb2..e4e53574183ea5316eb816d32a3df9e03b95f3b0 100644 (file)
@@ -85,6 +85,7 @@ struct vdpa_device {
        bool use_va;
        u32 nvqs;
        struct vdpa_mgmt_dev *mdev;
+       unsigned int ngroups;
 };
 
 /**
@@ -172,6 +173,10 @@ struct vdpa_map_file {
  *                             for the device
  *                             @vdev: vdpa device
  *                             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
  *                             @vdev: vdpa device
  *                             Returns the virtio features support by the
@@ -286,6 +291,7 @@ struct vdpa_config_ops {
 
        /* Device ops */
        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);
        int (*set_driver_features)(struct vdpa_device *vdev, u64 features);
        u64 (*get_driver_features)(struct vdpa_device *vdev);
@@ -318,6 +324,7 @@ struct vdpa_config_ops {
 
 struct vdpa_device *__vdpa_alloc_device(struct device *parent,
                                        const struct vdpa_config_ops *config,
+                                       unsigned int ngroups,
                                        size_t size, const char *name,
                                        bool use_va);
 
@@ -328,17 +335,18 @@ struct vdpa_device *__vdpa_alloc_device(struct device *parent,
  * @member: the name of struct vdpa_device within the @dev_struct
  * @parent: the parent 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
  * @use_va: indicate whether virtual address must be used by this device
  *
  * Return allocated data structure or ERR_PTR upon error
  */
-#define vdpa_alloc_device(dev_struct, member, parent, config, name, use_va)   \
-                         container_of(__vdpa_alloc_device( \
-                                      parent, config, \
+#define vdpa_alloc_device(dev_struct, member, parent, config, ngroups, name, use_va)   \
+                         container_of((__vdpa_alloc_device( \
+                                      parent, config, ngroups, \
                                       sizeof(dev_struct) + \
                                       BUILD_BUG_ON_ZERO(offsetof( \
-                                      dev_struct, member)), name, use_va), \
+                                      dev_struct, member)), name, use_va)), \
                                       dev_struct, member)
 
 int vdpa_register_device(struct vdpa_device *vdev, u32 nvqs);