Commit fd70a406 authored by Parav Pandit's avatar Parav Pandit Committed by Michael S. Tsirkin
Browse files

vdpa: Extend routine to accept vdpa device name



In a subsequent patch, when user initiated command creates a vdpa device,
the user chooses the name of the vdpa device.
To support it, extend the device allocation API to consider this name
specified by the caller driver.

Signed-off-by: default avatarParav Pandit <parav@nvidia.com>
Reviewed-by: default avatarEli Cohen <elic@nvidia.com>
Acked-by: default avatarJason Wang <jasowang@redhat.com>
Link: https://lore.kernel.org/r/20210105103203.82508-3-parav@nvidia.com


Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
parent 43794412
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -432,7 +432,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);
				    IFCVF_MAX_QUEUE_PAIRS * 2, NULL);
	if (adapter == NULL) {
		IFCVF_ERR(pdev, "Failed to allocate vDPA structure");
		return -ENOMEM;
+1 −1
Original line number Diff line number Diff line
@@ -1982,7 +1982,7 @@ static int mlx5v_probe(struct auxiliary_device *adev,
	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));
				 2 * mlx5_vdpa_max_qps(max_vqs), NULL);
	if (IS_ERR(ndev))
		return PTR_ERR(ndev);

+32 −4
Original line number Diff line number Diff line
@@ -12,6 +12,8 @@
#include <linux/slab.h>
#include <linux/vdpa.h>

/* A global mutex that protects vdpa management device and device level operations. */
static DEFINE_MUTEX(vdpa_dev_mutex);
static DEFINE_IDA(vdpa_index_ida);

static int vdpa_dev_probe(struct device *d)
@@ -63,6 +65,7 @@ static void vdpa_release_dev(struct device *d)
 * @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.
 *
 * Driver should use vdpa_alloc_device() wrapper macro instead of
 * using this directly.
@@ -72,8 +75,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)
					int nvqs, size_t size, const char *name)
{
	struct vdpa_device *vdev;
	int err = -EINVAL;
@@ -101,6 +103,9 @@ struct vdpa_device *__vdpa_alloc_device(struct device *parent,
	vdev->features_valid = false;
	vdev->nvqs = nvqs;

	if (name)
		err = dev_set_name(&vdev->dev, "%s", name);
	else
		err = dev_set_name(&vdev->dev, "vdpa%u", vdev->index);
	if (err)
		goto err_name;
@@ -118,6 +123,13 @@ struct vdpa_device *__vdpa_alloc_device(struct device *parent,
}
EXPORT_SYMBOL_GPL(__vdpa_alloc_device);

static int vdpa_name_match(struct device *dev, const void *data)
{
	struct vdpa_device *vdev = container_of(dev, struct vdpa_device, dev);

	return (strcmp(dev_name(&vdev->dev), data) == 0);
}

/**
 * vdpa_register_device - register a vDPA device
 * Callers must have a succeed call of vdpa_alloc_device() before.
@@ -127,7 +139,21 @@ EXPORT_SYMBOL_GPL(__vdpa_alloc_device);
 */
int vdpa_register_device(struct vdpa_device *vdev)
{
	return device_add(&vdev->dev);
	struct device *dev;
	int err;

	mutex_lock(&vdpa_dev_mutex);
	dev = bus_find_device(&vdpa_bus, NULL, dev_name(&vdev->dev), vdpa_name_match);
	if (dev) {
		put_device(dev);
		err = -EEXIST;
		goto name_err;
	}

	err = device_add(&vdev->dev);
name_err:
	mutex_unlock(&vdpa_dev_mutex);
	return err;
}
EXPORT_SYMBOL_GPL(vdpa_register_device);

@@ -137,7 +163,9 @@ EXPORT_SYMBOL_GPL(vdpa_register_device);
 */
void vdpa_unregister_device(struct vdpa_device *vdev)
{
	mutex_lock(&vdpa_dev_mutex);
	device_unregister(&vdev->dev);
	mutex_unlock(&vdpa_dev_mutex);
}
EXPORT_SYMBOL_GPL(vdpa_unregister_device);

+1 −1
Original line number Diff line number Diff line
@@ -235,7 +235,7 @@ struct vdpasim *vdpasim_create(struct vdpasim_dev_attr *dev_attr)
		ops = &vdpasim_config_ops;

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

+3 −4
Original line number Diff line number Diff line
@@ -245,15 +245,14 @@ struct vdpa_config_ops {

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

#define vdpa_alloc_device(dev_struct, member, parent, config, nvqs)   \
#define vdpa_alloc_device(dev_struct, member, parent, config, nvqs, name)   \
			  container_of(__vdpa_alloc_device( \
				       parent, config, nvqs, \
				       sizeof(dev_struct) + \
				       BUILD_BUG_ON_ZERO(offsetof( \
				       dev_struct, member))), \
				       dev_struct, member)), name), \
				       dev_struct, member)

int vdpa_register_device(struct vdpa_device *vdev);