From 53c0233cddebedd55d30e1ff64185c7ef409a9c7 Mon Sep 17 00:00:00 2001 From: Matthew Wilcox Date: Mon, 18 Feb 2019 16:09:14 -0500 Subject: [PATCH] of: Convert ovcs_idr to XArray Signed-off-by: Matthew Wilcox --- drivers/of/overlay.c | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/drivers/of/overlay.c b/drivers/of/overlay.c index c423e94baf0f..55a172f1c5db 100644 --- a/drivers/of/overlay.c +++ b/drivers/of/overlay.c @@ -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); -- 2.50.1