Skip to content

Commit

Permalink
RDMA/device: Use an ida instead of a free page in alloc_name
Browse files Browse the repository at this point in the history
ida is the proper data structure to hold list of clustered small integers
and then allocate an unused integer. Get rid of the convoluted and limited
open-coded bitmap.

Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
  • Loading branch information
Jason Gunthorpe committed Feb 8, 2019
1 parent 652432f commit 3b88afd
Showing 1 changed file with 17 additions and 11 deletions.
28 changes: 17 additions & 11 deletions drivers/infiniband/core/device.c
Original file line number Diff line number Diff line change
Expand Up @@ -213,30 +213,36 @@ int ib_device_rename(struct ib_device *ibdev, const char *name)

static int alloc_name(struct ib_device *ibdev, const char *name)
{
unsigned long *inuse;
struct ib_device *device;
struct ida inuse;
int rc;
int i;

inuse = (unsigned long *) get_zeroed_page(GFP_KERNEL);
if (!inuse)
return -ENOMEM;

ida_init(&inuse);
list_for_each_entry(device, &device_list, core_list) {
char buf[IB_DEVICE_NAME_MAX];

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

rc = ida_alloc_range(&inuse, i, i, GFP_KERNEL);
if (rc < 0)
goto out;
}

i = find_first_zero_bit(inuse, PAGE_SIZE * 8);
free_page((unsigned long) inuse);
rc = ida_alloc(&inuse, GFP_KERNEL);
if (rc < 0)
goto out;

return dev_set_name(&ibdev->dev, name, i);
rc = dev_set_name(&ibdev->dev, name, rc);
out:
ida_destroy(&inuse);
return rc;
}

static void ib_device_release(struct device *device)
Expand Down

0 comments on commit 3b88afd

Please sign in to comment.