mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-04 04:06:26 +00:00
mm: memcontrol: move memcg_online_kmem() to mem_cgroup_css_online()
It will simplify the code if moving memcg_online_kmem() to mem_cgroup_css_online() and do not need to set ->kmemcg_id to -1 to indicate the memcg is offline. In the next patch, ->kmemcg_id will be used to sync list lru reparenting which requires not to change ->kmemcg_id. Link: https://lkml.kernel.org/r/20220228122126.37293-10-songmuchun@bytedance.com Signed-off-by: Muchun Song <songmuchun@bytedance.com> Acked-by: Roman Gushchin <roman.gushchin@linux.dev> 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: 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: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
9bbdc0f324
commit
da0efe3094
@ -3670,7 +3670,8 @@ static int memcg_online_kmem(struct mem_cgroup *memcg)
|
||||
if (cgroup_memory_nokmem)
|
||||
return 0;
|
||||
|
||||
BUG_ON(memcg->kmemcg_id >= 0);
|
||||
if (unlikely(mem_cgroup_is_root(memcg)))
|
||||
return 0;
|
||||
|
||||
memcg_id = memcg_alloc_cache_id();
|
||||
if (memcg_id < 0)
|
||||
@ -3696,7 +3697,10 @@ static void memcg_offline_kmem(struct mem_cgroup *memcg)
|
||||
struct mem_cgroup *parent;
|
||||
int kmemcg_id;
|
||||
|
||||
if (memcg->kmemcg_id == -1)
|
||||
if (cgroup_memory_nokmem)
|
||||
return;
|
||||
|
||||
if (unlikely(mem_cgroup_is_root(memcg)))
|
||||
return;
|
||||
|
||||
parent = parent_mem_cgroup(memcg);
|
||||
@ -3706,7 +3710,6 @@ static void memcg_offline_kmem(struct mem_cgroup *memcg)
|
||||
memcg_reparent_objcgs(memcg, parent);
|
||||
|
||||
kmemcg_id = memcg->kmemcg_id;
|
||||
BUG_ON(kmemcg_id < 0);
|
||||
|
||||
/*
|
||||
* After we have finished memcg_reparent_objcgs(), all list_lrus
|
||||
@ -3717,7 +3720,6 @@ static void memcg_offline_kmem(struct mem_cgroup *memcg)
|
||||
memcg_drain_all_list_lrus(kmemcg_id, parent);
|
||||
|
||||
memcg_free_cache_id(kmemcg_id);
|
||||
memcg->kmemcg_id = -1;
|
||||
}
|
||||
#else
|
||||
static int memcg_online_kmem(struct mem_cgroup *memcg)
|
||||
@ -5237,7 +5239,6 @@ mem_cgroup_css_alloc(struct cgroup_subsys_state *parent_css)
|
||||
{
|
||||
struct mem_cgroup *parent = mem_cgroup_from_css(parent_css);
|
||||
struct mem_cgroup *memcg, *old_memcg;
|
||||
long error = -ENOMEM;
|
||||
|
||||
old_memcg = set_active_memcg(parent);
|
||||
memcg = mem_cgroup_alloc();
|
||||
@ -5266,34 +5267,26 @@ mem_cgroup_css_alloc(struct cgroup_subsys_state *parent_css)
|
||||
return &memcg->css;
|
||||
}
|
||||
|
||||
/* The following stuff does not apply to the root */
|
||||
error = memcg_online_kmem(memcg);
|
||||
if (error)
|
||||
goto fail;
|
||||
|
||||
if (cgroup_subsys_on_dfl(memory_cgrp_subsys) && !cgroup_memory_nosocket)
|
||||
static_branch_inc(&memcg_sockets_enabled_key);
|
||||
|
||||
return &memcg->css;
|
||||
fail:
|
||||
mem_cgroup_id_remove(memcg);
|
||||
mem_cgroup_free(memcg);
|
||||
return ERR_PTR(error);
|
||||
}
|
||||
|
||||
static int mem_cgroup_css_online(struct cgroup_subsys_state *css)
|
||||
{
|
||||
struct mem_cgroup *memcg = mem_cgroup_from_css(css);
|
||||
|
||||
if (memcg_online_kmem(memcg))
|
||||
goto remove_id;
|
||||
|
||||
/*
|
||||
* A memcg must be visible for expand_shrinker_info()
|
||||
* by the time the maps are allocated. So, we allocate maps
|
||||
* here, when for_each_mem_cgroup() can't skip it.
|
||||
*/
|
||||
if (alloc_shrinker_info(memcg)) {
|
||||
mem_cgroup_id_remove(memcg);
|
||||
return -ENOMEM;
|
||||
}
|
||||
if (alloc_shrinker_info(memcg))
|
||||
goto offline_kmem;
|
||||
|
||||
/* Online state pins memcg ID, memcg ID pins CSS */
|
||||
refcount_set(&memcg->id.ref, 1);
|
||||
@ -5303,6 +5296,11 @@ static int mem_cgroup_css_online(struct cgroup_subsys_state *css)
|
||||
queue_delayed_work(system_unbound_wq, &stats_flush_dwork,
|
||||
2UL*HZ);
|
||||
return 0;
|
||||
offline_kmem:
|
||||
memcg_offline_kmem(memcg);
|
||||
remove_id:
|
||||
mem_cgroup_id_remove(memcg);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
static void mem_cgroup_css_offline(struct cgroup_subsys_state *css)
|
||||
@ -5360,9 +5358,6 @@ static void mem_cgroup_css_free(struct cgroup_subsys_state *css)
|
||||
cancel_work_sync(&memcg->high_work);
|
||||
mem_cgroup_remove_from_trees(memcg);
|
||||
free_shrinker_info(memcg);
|
||||
|
||||
/* Need to offline kmem if online_css() fails */
|
||||
memcg_offline_kmem(memcg);
|
||||
mem_cgroup_free(memcg);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user