RDMA/device: Use an ida instead of a free page in alloc_name
authorJason Gunthorpe <jgg@mellanox.com>
Thu, 7 Feb 2019 05:41:51 +0000 (22:41 -0700)
committerJason Gunthorpe <jgg@mellanox.com>
Fri, 8 Feb 2019 23:56:45 +0000 (16:56 -0700)
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>
drivers/infiniband/core/device.c

index 1c54ded776d00cdbe0d5e941da4d414a6262d608..3a80f96c2919fd292905938491783798c06358d2 100644 (file)
@@ -213,30 +213,36 @@ out:
 
 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)