Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e349f858 authored by Jason Gunthorpe's avatar Jason Gunthorpe
Browse files

RDMA: Fully setup the device name in ib_register_device



The current code has two copies of the device name, ibdev->dev and
dev_name(&ibdev->dev), and they are setup at different times, which is
very confusing.

Set them both up at the same time and make dev_name() the lead name, which
is the proper use of the driver core APIs. To make it very clear that the
name is not valid until registration pass it in to the
ib_register_device() call rather than messing with ibdev->name directly.

Also the reorganization now checks that dev_name is unique even if it does
not contain a %.

Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
Acked-by: default avatarAdit Ranadive <aditr@vmware.com>
Reviewed-by: default avatarSteve Wise <swise@opengridcomputing.com>
Acked-by: default avatarDevesh Sharma <devesh.sharma@broadcom.com>
Reviewed-by: default avatarShiraz Saleem <shiraz.saleem@intel.com>
Reviewed-by: default avatarLeon Romanovsky <leonro@mellanox.com>
Reviewed-by: default avatarDennis Dalessandro <dennis.dalessandro@intel.com>
Reviewed-by: default avatarMichael J. Ruhl <michael.j.ruhl@intel.com>
parent 46bdf777
Loading
Loading
Loading
Loading
+20 −15
Original line number Diff line number Diff line
@@ -170,10 +170,9 @@ static struct ib_device *__ib_device_get_by_name(const char *name)
	return NULL;
}

static int alloc_name(char *name)
static int alloc_name(struct ib_device *ibdev, const char *name)
{
	unsigned long *inuse;
	char buf[IB_DEVICE_NAME_MAX];
	struct ib_device *device;
	int i;

@@ -182,24 +181,21 @@ static int alloc_name(char *name)
		return -ENOMEM;

	list_for_each_entry(device, &device_list, core_list) {
		if (!sscanf(device->name, name, &i))
		char buf[IB_DEVICE_NAME_MAX];

		if (sscanf(device->name, name, &i) != 1)
			continue;
		if (i < 0 || i >= PAGE_SIZE * 8)
			continue;
		snprintf(buf, sizeof buf, name, i);
		if (!strncmp(buf, device->name, IB_DEVICE_NAME_MAX))
		if (!strcmp(buf, dev_name(&device->dev)))
			set_bit(i, inuse);
	}

	i = find_first_zero_bit(inuse, PAGE_SIZE * 8);
	free_page((unsigned long) inuse);
	snprintf(buf, sizeof buf, name, i);

	if (__ib_device_get_by_name(buf))
		return -ENFILE;

	strlcpy(name, buf, IB_DEVICE_NAME_MAX);
	return 0;
	return dev_set_name(&ibdev->dev, name, i);
}

static void ib_device_release(struct device *device)
@@ -454,9 +450,9 @@ static u32 __dev_new_index(void)
 * callback for each device that is added. @device must be allocated
 * with ib_alloc_device().
 */
int ib_register_device(struct ib_device *device,
		       int (*port_callback)(struct ib_device *,
					    u8, struct kobject *))
int ib_register_device(struct ib_device *device, const char *name,
		       int (*port_callback)(struct ib_device *, u8,
					    struct kobject *))
{
	int ret;
	struct ib_client *client;
@@ -495,11 +491,20 @@ int ib_register_device(struct ib_device *device,

	mutex_lock(&device_mutex);

	if (strchr(device->name, '%')) {
		ret = alloc_name(device->name);
	if (strchr(name, '%')) {
		ret = alloc_name(device, name);
		if (ret)
			goto out;
	} else {
		ret = dev_set_name(&device->dev, name);
		if (ret)
			goto out;
	}
	if (__ib_device_get_by_name(dev_name(&device->dev))) {
		ret = -ENFILE;
		goto out;
	}
	strlcpy(device->name, dev_name(&device->dev), IB_DEVICE_NAME_MAX);

	if (ib_device_check_mandatory(device)) {
		ret = -EINVAL;
+0 −4
Original line number Diff line number Diff line
@@ -1311,10 +1311,6 @@ int ib_device_register_sysfs(struct ib_device *device,
	int ret;
	int i;

	ret = dev_set_name(class_dev, "%s", device->name);
	if (ret)
		return ret;

	device->groups[0] = &dev_attr_group;
	class_dev->groups = device->groups;

+1 −2
Original line number Diff line number Diff line
@@ -579,7 +579,6 @@ static int bnxt_re_register_ib(struct bnxt_re_dev *rdev)
	/* ib device init */
	ibdev->owner = THIS_MODULE;
	ibdev->node_type = RDMA_NODE_IB_CA;
	strlcpy(ibdev->name, "bnxt_re%d", IB_DEVICE_NAME_MAX);
	strlcpy(ibdev->node_desc, BNXT_RE_DESC " HCA",
		strlen(BNXT_RE_DESC) + 5);
	ibdev->phys_port_cnt = 1;
@@ -672,7 +671,7 @@ static int bnxt_re_register_ib(struct bnxt_re_dev *rdev)
	ibdev->alloc_hw_stats           = bnxt_re_ib_alloc_hw_stats;

	ibdev->driver_id = RDMA_DRIVER_BNXT_RE;
	return ib_register_device(ibdev, NULL);
	return ib_register_device(ibdev, "bnxt_re%d", NULL);
}

static ssize_t show_rev(struct device *device, struct device_attribute *attr,
+1 −2
Original line number Diff line number Diff line
@@ -1319,7 +1319,6 @@ int iwch_register_device(struct iwch_dev *dev)
	int i;

	pr_debug("%s iwch_dev %p\n", __func__, dev);
	strlcpy(dev->ibdev.name, "cxgb3_%d", IB_DEVICE_NAME_MAX);
	memset(&dev->ibdev.node_guid, 0, sizeof(dev->ibdev.node_guid));
	memcpy(&dev->ibdev.node_guid, dev->rdev.t3cdev_p->lldev->dev_addr, 6);
	dev->ibdev.owner = THIS_MODULE;
@@ -1402,7 +1401,7 @@ int iwch_register_device(struct iwch_dev *dev)
	       sizeof(dev->ibdev.iwcm->ifname));

	dev->ibdev.driver_id = RDMA_DRIVER_CXGB3;
	ret = ib_register_device(&dev->ibdev, NULL);
	ret = ib_register_device(&dev->ibdev, "cxgb3_%d", NULL);
	if (ret)
		goto bail1;

+1 −2
Original line number Diff line number Diff line
@@ -535,7 +535,6 @@ void c4iw_register_device(struct work_struct *work)
	struct c4iw_dev *dev = ctx->dev;

	pr_debug("c4iw_dev %p\n", dev);
	strlcpy(dev->ibdev.name, "cxgb4_%d", IB_DEVICE_NAME_MAX);
	memset(&dev->ibdev.node_guid, 0, sizeof(dev->ibdev.node_guid));
	memcpy(&dev->ibdev.node_guid, dev->rdev.lldi.ports[0]->dev_addr, 6);
	dev->ibdev.owner = THIS_MODULE;
@@ -627,7 +626,7 @@ void c4iw_register_device(struct work_struct *work)
	       sizeof(dev->ibdev.iwcm->ifname));

	dev->ibdev.driver_id = RDMA_DRIVER_CXGB4;
	ret = ib_register_device(&dev->ibdev, NULL);
	ret = ib_register_device(&dev->ibdev, "cxgb4_%d", NULL);
	if (ret)
		goto err_kfree_iwcm;

Loading