]> www.infradead.org Git - users/willy/xarray.git/commitdiff
of: Convert ovcs_idr to XArray
authorMatthew Wilcox <willy@infradead.org>
Mon, 18 Feb 2019 21:09:14 +0000 (16:09 -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/of/overlay.c

index c423e94baf0f02ba6aee663273a229502eb952cb..55a172f1c5db92deb395d37306d4f7b98c92a008 100644 (file)
@@ -117,7 +117,7 @@ void of_overlay_mutex_unlock(void)
 
 
 static LIST_HEAD(ovcs_list);
-static DEFINE_IDR(ovcs_idr);
+static DEFINE_XARRAY_ALLOC1(ovcs_array);
 
 static BLOCKING_NOTIFIER_HEAD(overlay_notify_chain);
 
@@ -722,7 +722,7 @@ static struct device_node *find_target(struct device_node *info_node)
  * nodes and the __symbols__ node.  Any other top level node will be ignored.
  *
  * Returns 0 on success, -ENOMEM if memory allocation failure, -EINVAL if error
- * detected in @tree, or -ENOSPC if idr_alloc() error.
+ * detected in @tree, or -EBUSY if id allocation fails.
  */
 static int init_overlay_changeset(struct overlay_changeset *ovcs,
                const void *fdt, struct device_node *tree)
@@ -730,7 +730,7 @@ static int init_overlay_changeset(struct overlay_changeset *ovcs,
        struct device_node *node, *overlay_node;
        struct fragment *fragment;
        struct fragment *fragments;
-       int cnt, id, ret;
+       int cnt, ret;
 
        /*
         * Warn for some issues.  Can not return -EINVAL for these until
@@ -752,9 +752,9 @@ static int init_overlay_changeset(struct overlay_changeset *ovcs,
 
        of_changeset_init(&ovcs->cset);
 
-       id = idr_alloc(&ovcs_idr, ovcs, 1, 0, GFP_KERNEL);
-       if (id <= 0)
-               return id;
+       ret = xa_alloc(&ovcs_array, &ovcs->id, ovcs, xa_limit_32b, GFP_KERNEL);
+       if (ret < 0)
+               return ret;
 
        cnt = 0;
 
@@ -776,7 +776,7 @@ static int init_overlay_changeset(struct overlay_changeset *ovcs,
        fragments = kcalloc(cnt, sizeof(*fragments), GFP_KERNEL);
        if (!fragments) {
                ret = -ENOMEM;
-               goto err_free_idr;
+               goto err_erase;
        }
 
        cnt = 0;
@@ -823,7 +823,6 @@ static int init_overlay_changeset(struct overlay_changeset *ovcs,
                goto err_free_fragments;
        }
 
-       ovcs->id = id;
        ovcs->count = cnt;
        ovcs->fragments = fragments;
 
@@ -831,8 +830,8 @@ static int init_overlay_changeset(struct overlay_changeset *ovcs,
 
 err_free_fragments:
        kfree(fragments);
-err_free_idr:
-       idr_remove(&ovcs_idr, id);
+err_erase:
+       xa_erase(&ovcs_array, ovcs->id);
 
        pr_err("%s() failed, ret = %d\n", __func__, ret);
 
@@ -847,7 +846,7 @@ static void free_overlay_changeset(struct overlay_changeset *ovcs)
                of_changeset_destroy(&ovcs->cset);
 
        if (ovcs->id)
-               idr_remove(&ovcs_idr, ovcs->id);
+               xa_erase(&ovcs_array, ovcs->id);
 
        for (i = 0; i < ovcs->count; i++) {
                of_node_put(ovcs->fragments[i].target);
@@ -1195,7 +1194,7 @@ int of_overlay_remove(int *ovcs_id)
 
        mutex_lock(&of_mutex);
 
-       ovcs = idr_find(&ovcs_idr, *ovcs_id);
+       ovcs = xa_load(&ovcs_array, *ovcs_id);
        if (!ovcs) {
                ret = -ENODEV;
                pr_err("remove: Could not find overlay #%d\n", *ovcs_id);