]> www.infradead.org Git - users/willy/xarray.git/commitdiff
mei: Convert mei_idr to IDA
authorMatthew Wilcox <willy@infradead.org>
Mon, 18 Feb 2019 19:08:36 +0000 (14:08 -0500)
committerMatthew Wilcox (Oracle) <willy@infradead.org>
Fri, 9 Aug 2019 01:38:17 +0000 (21:38 -0400)
Signed-off-by: Matthew Wilcox <willy@infradead.org>
drivers/misc/mei/main.c

index f894d1f8a53e0e248c344a8b4124bc783926bae0..88d7b45085c4a49dce9c04338ba78a66a10ba193 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/types.h>
 #include <linux/fcntl.h>
 #include <linux/poll.h>
+#include <linux/idr.h>
 #include <linux/init.h>
 #include <linux/ioctl.h>
 #include <linux/cdev.h>
@@ -31,8 +32,7 @@
 static struct class *mei_class;
 static dev_t mei_devt;
 #define MEI_MAX_DEVS  MINORMASK
-static DEFINE_MUTEX(mei_minor_lock);
-static DEFINE_IDR(mei_idr);
+static DEFINE_IDA(mei_ids);
 
 /**
  * mei_open - the open function
@@ -926,16 +926,13 @@ static const struct file_operations mei_fops = {
  */
 static int mei_minor_get(struct mei_device *dev)
 {
-       int ret;
-
-       mutex_lock(&mei_minor_lock);
-       ret = idr_alloc(&mei_idr, dev, 0, MEI_MAX_DEVS, GFP_KERNEL);
-       if (ret >= 0)
+       int ret = ida_alloc_max(&mei_ids, MEI_MAX_DEVS - 1, GFP_KERNEL);
+       if (ret >= 0) {
                dev->minor = ret;
-       else if (ret == -ENOSPC)
+               return 0;
+       }
+       if (ret == -EBUSY)
                dev_err(dev->dev, "too many mei devices\n");
-
-       mutex_unlock(&mei_minor_lock);
        return ret;
 }
 
@@ -946,9 +943,7 @@ static int mei_minor_get(struct mei_device *dev)
  */
 static void mei_minor_free(struct mei_device *dev)
 {
-       mutex_lock(&mei_minor_lock);
-       idr_remove(&mei_idr, dev->minor);
-       mutex_unlock(&mei_minor_lock);
+       ida_free(&mei_ids, dev->minor);
 }
 
 int mei_register(struct mei_device *dev, struct device *parent)