Jason Wang
2021-Jan-04 06:55 UTC
[PATCH V3 17/19] vdpa: set the virtqueue num during register
This patch delay the queue number setting to vDPA device registering. This allows us to probe the virtqueue numbers between device allocation and registering. Reviewed-by: Stefano Garzarella <sgarzare at redhat.com> Signed-off-by: Jason Wang <jasowang at redhat.com> --- drivers/vdpa/ifcvf/ifcvf_main.c | 5 ++--- drivers/vdpa/mlx5/net/mlx5_vnet.c | 5 ++--- drivers/vdpa/vdpa.c | 8 ++++---- drivers/vdpa/vdpa_sim/vdpa_sim.c | 4 ++-- include/linux/vdpa.h | 7 +++---- 5 files changed, 13 insertions(+), 16 deletions(-) diff --git a/drivers/vdpa/ifcvf/ifcvf_main.c b/drivers/vdpa/ifcvf/ifcvf_main.c index 8b4028556cb6..d65f3221d8ed 100644 --- a/drivers/vdpa/ifcvf/ifcvf_main.c +++ b/drivers/vdpa/ifcvf/ifcvf_main.c @@ -438,8 +438,7 @@ static int ifcvf_probe(struct pci_dev *pdev, const struct pci_device_id *id) } adapter = vdpa_alloc_device(struct ifcvf_adapter, vdpa, - dev, &ifc_vdpa_ops, - IFCVF_MAX_QUEUE_PAIRS * 2); + dev, &ifc_vdpa_ops); if (adapter == NULL) { IFCVF_ERR(pdev, "Failed to allocate vDPA structure"); return -ENOMEM; @@ -463,7 +462,7 @@ static int ifcvf_probe(struct pci_dev *pdev, const struct pci_device_id *id) for (i = 0; i < IFCVF_MAX_QUEUE_PAIRS * 2; i++) vf->vring[i].irq = -EINVAL; - ret = vdpa_register_device(&adapter->vdpa); + ret = vdpa_register_device(&adapter->vdpa, IFCVF_MAX_QUEUE_PAIRS * 2); if (ret) { IFCVF_ERR(pdev, "Failed to register ifcvf to vdpa bus"); goto err; diff --git a/drivers/vdpa/mlx5/net/mlx5_vnet.c b/drivers/vdpa/mlx5/net/mlx5_vnet.c index f1d54814db97..a1b9260bf04d 100644 --- a/drivers/vdpa/mlx5/net/mlx5_vnet.c +++ b/drivers/vdpa/mlx5/net/mlx5_vnet.c @@ -1958,8 +1958,7 @@ static int mlx5v_probe(struct auxiliary_device *adev, max_vqs = MLX5_CAP_DEV_VDPA_EMULATION(mdev, max_num_virtio_queues); max_vqs = min_t(u32, max_vqs, MLX5_MAX_SUPPORTED_VQS); - ndev = vdpa_alloc_device(struct mlx5_vdpa_net, mvdev.vdev, mdev->device, &mlx5_vdpa_ops, - 2 * mlx5_vdpa_max_qps(max_vqs)); + ndev = vdpa_alloc_device(struct mlx5_vdpa_net, mvdev.vdev, mdev->device, &mlx5_vdpa_ops); if (IS_ERR(ndev)) return PTR_ERR(ndev); @@ -1986,7 +1985,7 @@ static int mlx5v_probe(struct auxiliary_device *adev, if (err) goto err_res; - err = vdpa_register_device(&mvdev->vdev); + err = vdpa_register_device(&mvdev->vdev, 2 * mlx5_vdpa_max_qps(max_vqs)); if (err) goto err_reg; diff --git a/drivers/vdpa/vdpa.c b/drivers/vdpa/vdpa.c index a69ffc991e13..ba89238f9898 100644 --- a/drivers/vdpa/vdpa.c +++ b/drivers/vdpa/vdpa.c @@ -61,7 +61,6 @@ 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 - * @nvqs: number of virtqueues supported by this device * @size: size of the parent structure that contains private data * * Driver should use vdpa_alloc_device() wrapper macro instead of @@ -72,7 +71,6 @@ static void vdpa_release_dev(struct device *d) */ struct vdpa_device *__vdpa_alloc_device(struct device *parent, const struct vdpa_config_ops *config, - int nvqs, size_t size) { struct vdpa_device *vdev; @@ -99,7 +97,6 @@ struct vdpa_device *__vdpa_alloc_device(struct device *parent, vdev->index = err; vdev->config = config; vdev->features_valid = false; - vdev->nvqs = nvqs; err = dev_set_name(&vdev->dev, "vdpa%u", vdev->index); if (err) @@ -122,11 +119,14 @@ EXPORT_SYMBOL_GPL(__vdpa_alloc_device); * vdpa_register_device - register a vDPA device * Callers must have a succeed call of vdpa_alloc_device() before. * @vdev: the vdpa device to be registered to vDPA bus + * @nvqs: number of virtqueues supported by this device * * Returns an error when fail to add to vDPA bus */ -int vdpa_register_device(struct vdpa_device *vdev) +int vdpa_register_device(struct vdpa_device *vdev, int nvqs) { + vdev->nvqs = nvqs; + return device_add(&vdev->dev); } EXPORT_SYMBOL_GPL(vdpa_register_device); diff --git a/drivers/vdpa/vdpa_sim/vdpa_sim.c b/drivers/vdpa/vdpa_sim/vdpa_sim.c index 6a90fdb9cbfc..b129cb4dd013 100644 --- a/drivers/vdpa/vdpa_sim/vdpa_sim.c +++ b/drivers/vdpa/vdpa_sim/vdpa_sim.c @@ -357,7 +357,7 @@ static struct vdpasim *vdpasim_create(void) else ops = &vdpasim_net_config_ops; - vdpasim = vdpa_alloc_device(struct vdpasim, vdpa, NULL, ops, VDPASIM_VQ_NUM); + vdpasim = vdpa_alloc_device(struct vdpasim, vdpa, NULL, ops); if (!vdpasim) goto err_alloc; @@ -393,7 +393,7 @@ static struct vdpasim *vdpasim_create(void) vringh_set_iotlb(&vdpasim->vqs[1].vring, vdpasim->iommu); vdpasim->vdpa.dma_dev = dev; - ret = vdpa_register_device(&vdpasim->vdpa); + ret = vdpa_register_device(&vdpasim->vdpa, VDPASIM_VQ_NUM); if (ret) goto err_iommu; diff --git a/include/linux/vdpa.h b/include/linux/vdpa.h index 30bc7a7223bb..d9e9d17b9083 100644 --- a/include/linux/vdpa.h +++ b/include/linux/vdpa.h @@ -244,18 +244,17 @@ struct vdpa_config_ops { struct vdpa_device *__vdpa_alloc_device(struct device *parent, const struct vdpa_config_ops *config, - int nvqs, size_t size); -#define vdpa_alloc_device(dev_struct, member, parent, config, nvqs) \ +#define vdpa_alloc_device(dev_struct, member, parent, config) \ container_of(__vdpa_alloc_device( \ - parent, config, nvqs, \ + parent, config, \ sizeof(dev_struct) + \ BUILD_BUG_ON_ZERO(offsetof( \ dev_struct, member))), \ dev_struct, member) -int vdpa_register_device(struct vdpa_device *vdev); +int vdpa_register_device(struct vdpa_device *vdev, int nvqs); void vdpa_unregister_device(struct vdpa_device *vdev); /** -- 2.25.1
Michael S. Tsirkin
2021-Feb-05 15:27 UTC
[PATCH V3 17/19] vdpa: set the virtqueue num during register
On Mon, Jan 04, 2021 at 02:55:01PM +0800, Jason Wang wrote:> This patch delay the queue number setting to vDPA device > registering. This allows us to probe the virtqueue numbers between > device allocation and registering. > > Reviewed-by: Stefano Garzarella <sgarzare at redhat.com> > Signed-off-by: Jason Wang <jasowang at redhat.com>Conflicts with other patches in the vhost tree. Can you rebase please?> --- > drivers/vdpa/ifcvf/ifcvf_main.c | 5 ++--- > drivers/vdpa/mlx5/net/mlx5_vnet.c | 5 ++--- > drivers/vdpa/vdpa.c | 8 ++++---- > drivers/vdpa/vdpa_sim/vdpa_sim.c | 4 ++-- > include/linux/vdpa.h | 7 +++---- > 5 files changed, 13 insertions(+), 16 deletions(-) > > diff --git a/drivers/vdpa/ifcvf/ifcvf_main.c b/drivers/vdpa/ifcvf/ifcvf_main.c > index 8b4028556cb6..d65f3221d8ed 100644 > --- a/drivers/vdpa/ifcvf/ifcvf_main.c > +++ b/drivers/vdpa/ifcvf/ifcvf_main.c > @@ -438,8 +438,7 @@ static int ifcvf_probe(struct pci_dev *pdev, const struct pci_device_id *id) > } > > adapter = vdpa_alloc_device(struct ifcvf_adapter, vdpa, > - dev, &ifc_vdpa_ops, > - IFCVF_MAX_QUEUE_PAIRS * 2); > + dev, &ifc_vdpa_ops); > if (adapter == NULL) { > IFCVF_ERR(pdev, "Failed to allocate vDPA structure"); > return -ENOMEM; > @@ -463,7 +462,7 @@ static int ifcvf_probe(struct pci_dev *pdev, const struct pci_device_id *id) > for (i = 0; i < IFCVF_MAX_QUEUE_PAIRS * 2; i++) > vf->vring[i].irq = -EINVAL; > > - ret = vdpa_register_device(&adapter->vdpa); > + ret = vdpa_register_device(&adapter->vdpa, IFCVF_MAX_QUEUE_PAIRS * 2); > if (ret) { > IFCVF_ERR(pdev, "Failed to register ifcvf to vdpa bus"); > goto err; > diff --git a/drivers/vdpa/mlx5/net/mlx5_vnet.c b/drivers/vdpa/mlx5/net/mlx5_vnet.c > index f1d54814db97..a1b9260bf04d 100644 > --- a/drivers/vdpa/mlx5/net/mlx5_vnet.c > +++ b/drivers/vdpa/mlx5/net/mlx5_vnet.c > @@ -1958,8 +1958,7 @@ static int mlx5v_probe(struct auxiliary_device *adev, > max_vqs = MLX5_CAP_DEV_VDPA_EMULATION(mdev, max_num_virtio_queues); > max_vqs = min_t(u32, max_vqs, MLX5_MAX_SUPPORTED_VQS); > > - ndev = vdpa_alloc_device(struct mlx5_vdpa_net, mvdev.vdev, mdev->device, &mlx5_vdpa_ops, > - 2 * mlx5_vdpa_max_qps(max_vqs)); > + ndev = vdpa_alloc_device(struct mlx5_vdpa_net, mvdev.vdev, mdev->device, &mlx5_vdpa_ops); > if (IS_ERR(ndev)) > return PTR_ERR(ndev); > > @@ -1986,7 +1985,7 @@ static int mlx5v_probe(struct auxiliary_device *adev, > if (err) > goto err_res; > > - err = vdpa_register_device(&mvdev->vdev); > + err = vdpa_register_device(&mvdev->vdev, 2 * mlx5_vdpa_max_qps(max_vqs)); > if (err) > goto err_reg; > > diff --git a/drivers/vdpa/vdpa.c b/drivers/vdpa/vdpa.c > index a69ffc991e13..ba89238f9898 100644 > --- a/drivers/vdpa/vdpa.c > +++ b/drivers/vdpa/vdpa.c > @@ -61,7 +61,6 @@ 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 > - * @nvqs: number of virtqueues supported by this device > * @size: size of the parent structure that contains private data > * > * Driver should use vdpa_alloc_device() wrapper macro instead of > @@ -72,7 +71,6 @@ static void vdpa_release_dev(struct device *d) > */ > struct vdpa_device *__vdpa_alloc_device(struct device *parent, > const struct vdpa_config_ops *config, > - int nvqs, > size_t size) > { > struct vdpa_device *vdev; > @@ -99,7 +97,6 @@ struct vdpa_device *__vdpa_alloc_device(struct device *parent, > vdev->index = err; > vdev->config = config; > vdev->features_valid = false; > - vdev->nvqs = nvqs; > > err = dev_set_name(&vdev->dev, "vdpa%u", vdev->index); > if (err) > @@ -122,11 +119,14 @@ EXPORT_SYMBOL_GPL(__vdpa_alloc_device); > * vdpa_register_device - register a vDPA device > * Callers must have a succeed call of vdpa_alloc_device() before. > * @vdev: the vdpa device to be registered to vDPA bus > + * @nvqs: number of virtqueues supported by this device > * > * Returns an error when fail to add to vDPA bus > */ > -int vdpa_register_device(struct vdpa_device *vdev) > +int vdpa_register_device(struct vdpa_device *vdev, int nvqs) > { > + vdev->nvqs = nvqs; > + > return device_add(&vdev->dev); > } > EXPORT_SYMBOL_GPL(vdpa_register_device); > diff --git a/drivers/vdpa/vdpa_sim/vdpa_sim.c b/drivers/vdpa/vdpa_sim/vdpa_sim.c > index 6a90fdb9cbfc..b129cb4dd013 100644 > --- a/drivers/vdpa/vdpa_sim/vdpa_sim.c > +++ b/drivers/vdpa/vdpa_sim/vdpa_sim.c > @@ -357,7 +357,7 @@ static struct vdpasim *vdpasim_create(void) > else > ops = &vdpasim_net_config_ops; > > - vdpasim = vdpa_alloc_device(struct vdpasim, vdpa, NULL, ops, VDPASIM_VQ_NUM); > + vdpasim = vdpa_alloc_device(struct vdpasim, vdpa, NULL, ops); > if (!vdpasim) > goto err_alloc; > > @@ -393,7 +393,7 @@ static struct vdpasim *vdpasim_create(void) > vringh_set_iotlb(&vdpasim->vqs[1].vring, vdpasim->iommu); > > vdpasim->vdpa.dma_dev = dev; > - ret = vdpa_register_device(&vdpasim->vdpa); > + ret = vdpa_register_device(&vdpasim->vdpa, VDPASIM_VQ_NUM); > if (ret) > goto err_iommu; > > diff --git a/include/linux/vdpa.h b/include/linux/vdpa.h > index 30bc7a7223bb..d9e9d17b9083 100644 > --- a/include/linux/vdpa.h > +++ b/include/linux/vdpa.h > @@ -244,18 +244,17 @@ struct vdpa_config_ops { > > struct vdpa_device *__vdpa_alloc_device(struct device *parent, > const struct vdpa_config_ops *config, > - int nvqs, > size_t size); > > -#define vdpa_alloc_device(dev_struct, member, parent, config, nvqs) \ > +#define vdpa_alloc_device(dev_struct, member, parent, config) \ > container_of(__vdpa_alloc_device( \ > - parent, config, nvqs, \ > + parent, config, \ > sizeof(dev_struct) + \ > BUILD_BUG_ON_ZERO(offsetof( \ > dev_struct, member))), \ > dev_struct, member) > > -int vdpa_register_device(struct vdpa_device *vdev); > +int vdpa_register_device(struct vdpa_device *vdev, int nvqs); > void vdpa_unregister_device(struct vdpa_device *vdev); > > /** > -- > 2.25.1