]> www.infradead.org Git - users/willy/xarray.git/commitdiff
memcontrol: Convert mem_cgroup IDR to XArray
authorMatthew Wilcox <willy@infradead.org>
Tue, 12 Feb 2019 04:19:18 +0000 (23:19 -0500)
committerMatthew Wilcox (Oracle) <willy@infradead.org>
Fri, 9 Aug 2019 01:38:15 +0000 (21:38 -0400)
Signed-off-by: Matthew Wilcox <willy@infradead.org>
mm/memcontrol.c

index cdbb7a84cb6e186242afeebb32f4c5c7fb2d0639..e80c8f0f11436f5d76f0719e25e1726853ed5b4c 100644 (file)
@@ -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);