RDMA/uverbs: Use kernel API to allocate uverbs indexes
authorLeon Romanovsky <leonro@mellanox.com>
Tue, 2 Oct 2018 08:13:29 +0000 (11:13 +0300)
committerDoug Ledford <dledford@redhat.com>
Tue, 16 Oct 2018 18:36:21 +0000 (14:36 -0400)
Replace custom code to allocate indexes to generic kernel API.

Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/core/uverbs_main.c

index 4258cbd55ed7cf050a695dc7209f822c113a2d05..6d373f5515b7e2f525b4cf9ffece3f1d5da0420e 100644 (file)
@@ -73,7 +73,7 @@ enum {
 static dev_t dynamic_uverbs_dev;
 static struct class *uverbs_class;
 
-static DECLARE_BITMAP(dev_map, IB_UVERBS_MAX_DEVICES);
+static DEFINE_IDA(uverbs_ida);
 
 static ssize_t (*uverbs_cmd_table[])(struct ib_uverbs_file *file,
                                     const char __user *buf, int in_len,
@@ -1268,11 +1268,11 @@ static void ib_uverbs_add_one(struct ib_device *device)
        rcu_assign_pointer(uverbs_dev->ib_dev, device);
        uverbs_dev->num_comp_vectors = device->num_comp_vectors;
 
-       devnum = find_first_zero_bit(dev_map, IB_UVERBS_MAX_DEVICES);
-       if (devnum >= IB_UVERBS_MAX_DEVICES)
+       devnum = ida_alloc_max(&uverbs_ida, IB_UVERBS_MAX_DEVICES - 1,
+                              GFP_KERNEL);
+       if (devnum < 0)
                goto err;
        uverbs_dev->devnum = devnum;
-       set_bit(devnum, dev_map);
        if (devnum >= IB_UVERBS_NUM_FIXED_MINOR)
                base = dynamic_uverbs_dev + devnum - IB_UVERBS_NUM_FIXED_MINOR;
        else
@@ -1296,7 +1296,7 @@ static void ib_uverbs_add_one(struct ib_device *device)
        return;
 
 err_uapi:
-       clear_bit(devnum, dev_map);
+       ida_free(&uverbs_ida, devnum);
 err:
        if (atomic_dec_and_test(&uverbs_dev->refcount))
                ib_uverbs_comp_dev(uverbs_dev);
@@ -1371,7 +1371,7 @@ static void ib_uverbs_remove_one(struct ib_device *device, void *client_data)
                return;
 
        cdev_device_del(&uverbs_dev->cdev, &uverbs_dev->dev);
-       clear_bit(uverbs_dev->devnum, dev_map);
+       ida_free(&uverbs_ida, uverbs_dev->devnum);
 
        if (device->disassociate_ucontext) {
                /* We disassociate HW resources and immediately return.