]> www.infradead.org Git - users/willy/xarray.git/commitdiff
zram: Convert zram_index_idr to XArray
authorMatthew Wilcox <willy@infradead.org>
Fri, 15 Feb 2019 18:31:29 +0000 (13:31 -0500)
committerMatthew Wilcox (Oracle) <willy@infradead.org>
Thu, 8 Aug 2019 02:35:38 +0000 (22:35 -0400)
Signed-off-by: Matthew Wilcox <willy@infradead.org>
drivers/block/zram/zram_drv.c

index d58a359a66225f39682c067739eb9843bae36b80..ac0ca9bc069660e2180322de5d281d9025b2e65e 100644 (file)
@@ -36,9 +36,7 @@
 
 #include "zram_drv.h"
 
-static DEFINE_IDR(zram_index_idr);
-/* idr index must be protected */
-static DEFINE_MUTEX(zram_index_mutex);
+static DEFINE_XARRAY_ALLOC(zram_devs);
 
 static int zram_major;
 static const char *default_compressor = "lzo-rle";
@@ -1882,10 +1880,9 @@ static int zram_add(void)
        if (!zram)
                return -ENOMEM;
 
-       ret = idr_alloc(&zram_index_idr, zram, 0, 0, GFP_KERNEL);
+       ret = xa_alloc(&zram_devs, &device_id, zram, xa_limit_32b, GFP_KERNEL);
        if (ret < 0)
                goto out_free_dev;
-       device_id = ret;
 
        init_rwsem(&zram->init_lock);
 #ifdef CONFIG_ZRAM_WRITEBACK
@@ -1896,7 +1893,7 @@ static int zram_add(void)
                pr_err("Error allocating disk queue for device %d\n",
                        device_id);
                ret = -ENOMEM;
-               goto out_free_idr;
+               goto out_remove_dev;
        }
 
        blk_queue_make_request(queue, zram_make_request);
@@ -1960,8 +1957,8 @@ static int zram_add(void)
 
 out_free_queue:
        blk_cleanup_queue(queue);
-out_free_idr:
-       idr_remove(&zram_index_idr, device_id);
+out_remove_dev:
+       xa_erase(&zram_devs, device_id);
 out_free_dev:
        kfree(zram);
        return ret;
@@ -2015,9 +2012,7 @@ static ssize_t hot_add_show(struct class *class,
 {
        int ret;
 
-       mutex_lock(&zram_index_mutex);
        ret = zram_add();
-       mutex_unlock(&zram_index_mutex);
 
        if (ret < 0)
                return ret;
@@ -2040,18 +2035,15 @@ static ssize_t hot_remove_store(struct class *class,
        if (dev_id < 0)
                return -EINVAL;
 
-       mutex_lock(&zram_index_mutex);
-
-       zram = idr_find(&zram_index_idr, dev_id);
+       zram = xa_load(&zram_devs, dev_id);
        if (zram) {
                ret = zram_remove(zram);
                if (!ret)
-                       idr_remove(&zram_index_idr, dev_id);
+                       xa_erase(&zram_devs, dev_id);
        } else {
                ret = -ENODEV;
        }
 
-       mutex_unlock(&zram_index_mutex);
        return ret ? ret : count;
 }
 static CLASS_ATTR_WO(hot_remove);
@@ -2069,18 +2061,18 @@ static struct class zram_control_class = {
        .class_groups   = zram_control_class_groups,
 };
 
-static int zram_remove_cb(int id, void *ptr, void *data)
-{
-       zram_remove(ptr);
-       return 0;
-}
-
 static void destroy_devices(void)
 {
+       struct zram *zram;
+       unsigned long index;
+
        class_unregister(&zram_control_class);
-       idr_for_each(&zram_index_idr, &zram_remove_cb, NULL);
+       xa_for_each(&zram_devs, index, zram) {
+               zram_remove(zram);
+       }
+       xa_destroy(&zram_devs);
+
        zram_debugfs_destroy();
-       idr_destroy(&zram_index_idr);
        unregister_blkdev(zram_major, "zram");
        cpuhp_remove_multi_state(CPUHP_ZCOMP_PREPARE);
 }
@@ -2111,9 +2103,7 @@ static int __init zram_init(void)
        }
 
        while (num_devices != 0) {
-               mutex_lock(&zram_index_mutex);
                ret = zram_add();
-               mutex_unlock(&zram_index_mutex);
                if (ret < 0)
                        goto out_error;
                num_devices--;