Commit 7e9f220b authored by Jason Wang's avatar Jason Wang Committed by Pengyuan Zhao
Browse files

vdpa: set the virtqueue num during register

stable inclusion
from stable-v5.12
commit f00bdce0
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I5WXCZ
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=f00bdce0455233a0b76dae6364442dca717a574c



----------------------------------------------------------------------

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: default avatarStefano Garzarella <sgarzare@redhat.com>
Signed-off-by: default avatarJason Wang <jasowang@redhat.com>
Link: https://lore.kernel.org/r/20210223061905.422659-3-jasowang@redhat.com


Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
Signed-off-by: default avatarPengyuan Zhao <zhaopengyuan@hisilicon.com>
parent a7529b33
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -444,8 +444,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, NULL);
				    dev, &ifc_vdpa_ops, NULL);
	if (adapter == NULL) {
		IFCVF_ERR(pdev, "Failed to allocate vDPA structure");
		return -ENOMEM;
@@ -469,7 +468,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;
+2 −2
Original line number Diff line number Diff line
@@ -2000,7 +2000,7 @@ void *mlx5_vdpa_add_dev(struct mlx5_core_dev *mdev)
	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));
				 NULL);
	if (IS_ERR(ndev))
		return ndev;

@@ -2034,7 +2034,7 @@ void *mlx5_vdpa_add_dev(struct mlx5_core_dev *mdev)
	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;

+10 −8
Original line number Diff line number Diff line
@@ -69,7 +69,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
 * @name: name of the vdpa device; optional.
 *
@@ -81,7 +80,7 @@ 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, const char *name)
					size_t size, const char *name)
{
	struct vdpa_device *vdev;
	int err = -EINVAL;
@@ -107,7 +106,6 @@ struct vdpa_device *__vdpa_alloc_device(struct device *parent,
	vdev->index = err;
	vdev->config = config;
	vdev->features_valid = false;
	vdev->nvqs = nvqs;

	if (name)
		err = dev_set_name(&vdev->dev, "%s", name);
@@ -136,10 +134,12 @@ static int vdpa_name_match(struct device *dev, const void *data)
	return (strcmp(dev_name(&vdev->dev), data) == 0);
}

static int __vdpa_register_device(struct vdpa_device *vdev)
static int __vdpa_register_device(struct vdpa_device *vdev, int nvqs)
{
	struct device *dev;

	vdev->nvqs = nvqs;

	lockdep_assert_held(&vdpa_dev_mutex);
	dev = bus_find_device(&vdpa_bus, NULL, dev_name(&vdev->dev), vdpa_name_match);
	if (dev) {
@@ -155,15 +155,16 @@ static int __vdpa_register_device(struct vdpa_device *vdev)
 * Caller must invoke this routine in the management device dev_add()
 * callback after setting up valid mgmtdev for this vdpa device.
 * @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 device to vDPA bus
 */
int _vdpa_register_device(struct vdpa_device *vdev)
int _vdpa_register_device(struct vdpa_device *vdev, int nvqs)
{
	if (!vdev->mdev)
		return -EINVAL;

	return __vdpa_register_device(vdev);
	return __vdpa_register_device(vdev, nvqs);
}
EXPORT_SYMBOL_GPL(_vdpa_register_device);

@@ -171,15 +172,16 @@ EXPORT_SYMBOL_GPL(_vdpa_register_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)
{
	int err;

	mutex_lock(&vdpa_dev_mutex);
	err = __vdpa_register_device(vdev);
	err = __vdpa_register_device(vdev, nvqs);
	mutex_unlock(&vdpa_dev_mutex);
	return err;
}
+1 −1
Original line number Diff line number Diff line
@@ -377,7 +377,7 @@ static struct vdpasim *vdpasim_create(struct vdpasim_dev_attr *dev_attr)
		ops = &vdpasim_net_config_ops;

	vdpasim = vdpa_alloc_device(struct vdpasim, vdpa, NULL, ops,
				    dev_attr->nvqs, NULL);
				    NULL);
	if (!vdpasim)
		goto err_alloc;

+5 −5
Original line number Diff line number Diff line
@@ -255,20 +255,20 @@ struct vdpa_config_ops {

struct vdpa_device *__vdpa_alloc_device(struct device *parent,
					const struct vdpa_config_ops *config,
					int nvqs, size_t size, const char *name);
					size_t size, const char *name);

#define vdpa_alloc_device(dev_struct, member, parent, config, nvqs, name)   \
#define vdpa_alloc_device(dev_struct, member, parent, config, name)   \
			  container_of(__vdpa_alloc_device( \
				       parent, config, nvqs, \
				       parent, config, \
				       sizeof(dev_struct) + \
				       BUILD_BUG_ON_ZERO(offsetof( \
				       dev_struct, member)), name), \
				       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);

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);

/**