]> www.infradead.org Git - users/willy/xarray.git/commitdiff
interconnect: Convert icc_idr to XArray
authorMatthew Wilcox <willy@infradead.org>
Thu, 14 Mar 2019 22:11:57 +0000 (18:11 -0400)
committerMatthew Wilcox (Oracle) <willy@infradead.org>
Fri, 9 Aug 2019 01:38:19 +0000 (21:38 -0400)
Signed-off-by: Matthew Wilcox <willy@infradead.org>
drivers/interconnect/core.c

index 871eb4bc4efc7d100ad9eabac869f9449607ecb8..4c668f236bb59112053bdec5c122acea5b7ee026 100644 (file)
@@ -19,7 +19,7 @@
 #include <linux/of.h>
 #include <linux/overflow.h>
 
-static DEFINE_IDR(icc_idr);
+static DEFINE_XARRAY(icc_nodes);
 static LIST_HEAD(icc_providers);
 static DEFINE_MUTEX(icc_lock);
 static struct dentry *icc_debugfs_dir;
@@ -94,7 +94,7 @@ DEFINE_SHOW_ATTRIBUTE(icc_summary);
 
 static struct icc_node *node_find(const int id)
 {
-       return idr_find(&icc_idr, id);
+       return xa_load(&icc_nodes, id);
 }
 
 static struct icc_path *path_init(struct device *dev, struct icc_node *dst,
@@ -523,6 +523,7 @@ EXPORT_SYMBOL_GPL(icc_put);
 static struct icc_node *icc_node_create_nolock(int id)
 {
        struct icc_node *node;
+       int err;
 
        /* check if node already exists */
        node = node_find(id);
@@ -533,15 +534,14 @@ static struct icc_node *icc_node_create_nolock(int id)
        if (!node)
                return ERR_PTR(-ENOMEM);
 
-       id = idr_alloc(&icc_idr, node, id, id + 1, GFP_KERNEL);
-       if (id < 0) {
-               WARN(1, "%s: couldn't get idr\n", __func__);
+       node->id = id;
+       err = xa_insert(&icc_nodes, id, node, GFP_KERNEL);
+       if (err < 0) {
+               WARN(1, "%s: id error %d\n", __func__, err);
                kfree(node);
-               return ERR_PTR(id);
+               return ERR_PTR(err);
        }
 
-       node->id = id;
-
        return node;
 }
 
@@ -575,9 +575,8 @@ void icc_node_destroy(int id)
 
        mutex_lock(&icc_lock);
 
-       node = node_find(id);
+       node = xa_erase(&icc_nodes, id);
        if (node) {
-               idr_remove(&icc_idr, node->id);
                WARN_ON(!hlist_empty(&node->req_list));
        }