From: Matthew Wilcox Date: Tue, 12 Feb 2019 04:19:18 +0000 (-0500) Subject: memcontrol: Convert mem_cgroup IDR to XArray X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=4354a5fb46733e5c6f4d61b7556165fcac5f5fbe;p=users%2Fwilly%2Fxarray.git memcontrol: Convert mem_cgroup IDR to XArray Signed-off-by: Matthew Wilcox --- 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);