OSDN Git Service

mmc: core: Convert from IDR to IDA for host indexes
authorUlf Hansson <ulf.hansson@linaro.org>
Thu, 7 Apr 2016 09:40:59 +0000 (11:40 +0200)
committerUlf Hansson <ulf.hansson@linaro.org>
Mon, 2 May 2016 08:33:36 +0000 (10:33 +0200)
As IDA is more lightweight than IDR, let's convert to use that instead.

Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/core/host.c

index 6e4c55a..e0a3ee1 100644 (file)
 
 #define cls_dev_to_mmc_host(d) container_of(d, struct mmc_host, class_dev)
 
-static DEFINE_IDR(mmc_host_idr);
+static DEFINE_IDA(mmc_host_ida);
 static DEFINE_SPINLOCK(mmc_host_lock);
 
 static void mmc_host_classdev_release(struct device *dev)
 {
        struct mmc_host *host = cls_dev_to_mmc_host(dev);
        spin_lock(&mmc_host_lock);
-       idr_remove(&mmc_host_idr, host->index);
+       ida_remove(&mmc_host_ida, host->index);
        spin_unlock(&mmc_host_lock);
        kfree(host);
 }
@@ -321,14 +321,20 @@ struct mmc_host *mmc_alloc_host(int extra, struct device *dev)
 
        /* scanning will be enabled when we're ready */
        host->rescan_disable = 1;
-       idr_preload(GFP_KERNEL);
+
+again:
+       if (!ida_pre_get(&mmc_host_ida, GFP_KERNEL)) {
+               kfree(host);
+               return NULL;
+       }
+
        spin_lock(&mmc_host_lock);
-       err = idr_alloc(&mmc_host_idr, host, 0, 0, GFP_NOWAIT);
-       if (err >= 0)
-               host->index = err;
+       err = ida_get_new(&mmc_host_ida, &host->index);
        spin_unlock(&mmc_host_lock);
-       idr_preload_end();
-       if (err < 0) {
+
+       if (err == -EAGAIN) {
+               goto again;
+       } else if (err) {
                kfree(host);
                return NULL;
        }