Commit f9c69d63 authored by Muchun Song's avatar Muchun Song Committed by Linus Torvalds

mm: memcontrol: reuse memory cgroup ID for kmem ID

There are two idrs being used by memory cgroup, one is for kmem ID,
another is for memory cgroup ID.  The maximum ID of both is 64Ki.  Both
of them can limit the total number of memory cgroups.  Actually, we can
reuse memory cgroup ID for kmem ID to simplify the code.

Link: https://lkml.kernel.org/r/20220228122126.37293-14-songmuchun@bytedance.comSigned-off-by: default avatarMuchun Song <songmuchun@bytedance.com>
Cc: Alex Shi <alexs@kernel.org>
Cc: Anna Schumaker <Anna.Schumaker@Netapp.com>
Cc: Chao Yu <chao@kernel.org>
Cc: Dave Chinner <david@fromorbit.com>
Cc: Fam Zheng <fam.zheng@bytedance.com>
Cc: Jaegeuk Kim <jaegeuk@kernel.org>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Kari Argillander <kari.argillander@gmail.com>
Cc: Matthew Wilcox (Oracle) <willy@infradead.org>
Cc: Michal Hocko <mhocko@kernel.org>
Cc: Qi Zheng <zhengqi.arch@bytedance.com>
Cc: Roman Gushchin <roman.gushchin@linux.dev>
Cc: Shakeel Butt <shakeelb@google.com>
Cc: Theodore Ts'o <tytso@mit.edu>
Cc: Trond Myklebust <trond.myklebust@hammerspace.com>
Cc: Vladimir Davydov <vdavydov.dev@gmail.com>
Cc: Vlastimil Babka <vbabka@suse.cz>
Cc: Wei Yang <richard.weiyang@gmail.com>
Cc: Xiongchun Duan <duanxiongchun@bytedance.com>
Cc: Yang Shi <shy828301@gmail.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent bbca91cc
...@@ -347,23 +347,6 @@ static void memcg_reparent_objcgs(struct mem_cgroup *memcg, ...@@ -347,23 +347,6 @@ static void memcg_reparent_objcgs(struct mem_cgroup *memcg,
percpu_ref_kill(&objcg->refcnt); percpu_ref_kill(&objcg->refcnt);
} }
/*
* This will be used as a shrinker list's index.
* The main reason for not using cgroup id for this:
* this works better in sparse environments, where we have a lot of memcgs,
* but only a few kmem-limited.
*/
static DEFINE_IDA(memcg_cache_ida);
/*
* MAX_SIZE should be as large as the number of cgrp_ids. Ideally, we could get
* this constant directly from cgroup, but it is understandable that this is
* better kept as an internal representation in cgroup.c. In any case, the
* cgrp_id space is not getting any smaller, and we don't have to necessarily
* increase ours as well if it increases.
*/
#define MEMCG_CACHES_MAX_SIZE MEM_CGROUP_ID_MAX
/* /*
* A lot of the calls to the cache allocation functions are expected to be * A lot of the calls to the cache allocation functions are expected to be
* inlined by the compiler. Since the calls to memcg_slab_pre_alloc_hook() are * inlined by the compiler. Since the calls to memcg_slab_pre_alloc_hook() are
...@@ -3597,7 +3580,6 @@ static u64 mem_cgroup_read_u64(struct cgroup_subsys_state *css, ...@@ -3597,7 +3580,6 @@ static u64 mem_cgroup_read_u64(struct cgroup_subsys_state *css,
static int memcg_online_kmem(struct mem_cgroup *memcg) static int memcg_online_kmem(struct mem_cgroup *memcg)
{ {
struct obj_cgroup *objcg; struct obj_cgroup *objcg;
int memcg_id;
if (cgroup_memory_nokmem) if (cgroup_memory_nokmem)
return 0; return 0;
...@@ -3605,22 +3587,16 @@ static int memcg_online_kmem(struct mem_cgroup *memcg) ...@@ -3605,22 +3587,16 @@ static int memcg_online_kmem(struct mem_cgroup *memcg)
if (unlikely(mem_cgroup_is_root(memcg))) if (unlikely(mem_cgroup_is_root(memcg)))
return 0; return 0;
memcg_id = ida_alloc_max(&memcg_cache_ida, MEMCG_CACHES_MAX_SIZE - 1,
GFP_KERNEL);
if (memcg_id < 0)
return memcg_id;
objcg = obj_cgroup_alloc(); objcg = obj_cgroup_alloc();
if (!objcg) { if (!objcg)
ida_free(&memcg_cache_ida, memcg_id);
return -ENOMEM; return -ENOMEM;
}
objcg->memcg = memcg; objcg->memcg = memcg;
rcu_assign_pointer(memcg->objcg, objcg); rcu_assign_pointer(memcg->objcg, objcg);
static_branch_enable(&memcg_kmem_enabled_key); static_branch_enable(&memcg_kmem_enabled_key);
memcg->kmemcg_id = memcg_id; memcg->kmemcg_id = memcg->id.id;
return 0; return 0;
} }
...@@ -3628,7 +3604,6 @@ static int memcg_online_kmem(struct mem_cgroup *memcg) ...@@ -3628,7 +3604,6 @@ static int memcg_online_kmem(struct mem_cgroup *memcg)
static void memcg_offline_kmem(struct mem_cgroup *memcg) static void memcg_offline_kmem(struct mem_cgroup *memcg)
{ {
struct mem_cgroup *parent; struct mem_cgroup *parent;
int kmemcg_id;
if (cgroup_memory_nokmem) if (cgroup_memory_nokmem)
return; return;
...@@ -3642,12 +3617,6 @@ static void memcg_offline_kmem(struct mem_cgroup *memcg) ...@@ -3642,12 +3617,6 @@ static void memcg_offline_kmem(struct mem_cgroup *memcg)
memcg_reparent_objcgs(memcg, parent); memcg_reparent_objcgs(memcg, parent);
/*
* memcg_reparent_list_lrus() can change memcg->kmemcg_id.
* Cache it to local @kmemcg_id.
*/
kmemcg_id = memcg->kmemcg_id;
/* /*
* After we have finished memcg_reparent_objcgs(), all list_lrus * After we have finished memcg_reparent_objcgs(), all list_lrus
* corresponding to this cgroup are guaranteed to remain empty. * corresponding to this cgroup are guaranteed to remain empty.
...@@ -3655,8 +3624,6 @@ static void memcg_offline_kmem(struct mem_cgroup *memcg) ...@@ -3655,8 +3624,6 @@ static void memcg_offline_kmem(struct mem_cgroup *memcg)
* memcg_reparent_list_lrus(). * memcg_reparent_list_lrus().
*/ */
memcg_reparent_list_lrus(memcg, parent); memcg_reparent_list_lrus(memcg, parent);
ida_free(&memcg_cache_ida, kmemcg_id);
} }
#else #else
static int memcg_online_kmem(struct mem_cgroup *memcg) static int memcg_online_kmem(struct mem_cgroup *memcg)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment