From 4354a5fb46733e5c6f4d61b7556165fcac5f5fbe Mon Sep 17 00:00:00 2001 From: Matthew Wilcox Date: Mon, 11 Feb 2019 23:19:18 -0500 Subject: [PATCH] memcontrol: Convert mem_cgroup IDR to XArray Signed-off-by: Matthew Wilcox --- mm/memcontrol.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index cdbb7a84cb6e..e80c8f0f1143 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -4517,7 +4517,7 @@ static struct cftype mem_cgroup_legacy_files[] = { }; /* - * Private memory cgroup IDR + * Private memory cgroup XArray * * Swap-out records and page cache shadow entries need to store memcg * references in constrained space, so we maintain an ID space that is @@ -4540,12 +4540,12 @@ static struct cftype mem_cgroup_legacy_files[] = { * those references are manageable from userspace. */ -static DEFINE_IDR(mem_cgroup_idr); +static DEFINE_XARRAY_ALLOC1(mem_cgroups); static void mem_cgroup_id_remove(struct mem_cgroup *memcg) { if (memcg->id.id > 0) { - idr_remove(&mem_cgroup_idr, memcg->id.id); + xa_erase(&mem_cgroups, memcg->id.id); memcg->id.id = 0; } } @@ -4583,8 +4583,7 @@ static inline void mem_cgroup_id_put(struct mem_cgroup *memcg) */ struct mem_cgroup *mem_cgroup_from_id(unsigned short id) { - WARN_ON_ONCE(!rcu_read_lock_held()); - return idr_find(&mem_cgroup_idr, id); + return xa_load(&mem_cgroups, id); } static int alloc_mem_cgroup_per_node_info(struct mem_cgroup *memcg, int node) @@ -4669,10 +4668,8 @@ static struct mem_cgroup *mem_cgroup_alloc(void) if (!memcg) return NULL; - memcg->id.id = idr_alloc(&mem_cgroup_idr, NULL, - 1, MEM_CGROUP_ID_MAX, - GFP_KERNEL); - if (memcg->id.id < 0) + if (xa_alloc(&mem_cgroups, &memcg->id.id, NULL, + XA_LIMIT(0, MEM_CGROUP_ID_MAX - 1), GFP_KERNEL)) goto fail; memcg->vmstats_local = alloc_percpu(struct memcg_vmstats_percpu); @@ -4705,7 +4702,7 @@ static struct mem_cgroup *mem_cgroup_alloc(void) #ifdef CONFIG_CGROUP_WRITEBACK INIT_LIST_HEAD(&memcg->cgwb_list); #endif - idr_replace(&mem_cgroup_idr, memcg, memcg->id.id); + xa_store(&mem_cgroups, memcg->id.id, memcg, GFP_KERNEL); return memcg; fail: mem_cgroup_id_remove(memcg); -- 2.50.1