提交 5cda4079 编写于 作者: T tatataeki 提交者: Zheng Zengkai

mm: memcontrol: add the flag_stat file

hulk inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I4MC3F
CVE: NA

----------------------------------

Multiple operations on cgroups in cgroup v1 are related to the status
of the cgroup. The status of the current cgroup can be displayed in
cgroupv2, but it cannot be displayed in cgroup v1, so the
cgroup.flag_stat member is added in memory cgroup to display the
status of the current cgroup and sub-cgroups.

Testing result:
List the status of user.slice
[root@test user.slice]#cat memory.flag_stat
NO_REF 0
ONLINE 1
RELEASED 0
VISIBLE 1
DYING 0
CHILD_NO_REF 0
CHILD_ONLINE 1
CHILD_RELEASED 0
CHILD_VISIBLE 1
CHILD_DYING 0

Create a new cgroup in user.slice
[root@test user.slice]#mkdir user-test

List the current status of user.slice after operation above
[root@test user.slice]#cat memory.flag_stat
NO_REF 0
ONLINE 1
RELEASED 0
VISIBLE 1
DYING 0
CHILD_NO_REF 0
CHILD_ONLINE 2
CHILD_RELEASED 0
CHILD_VISIBLE 2
CHILD_DYING 0
Signed-off-by: Ntatataeki <shengzeyu19_98@163.com>
Reviewed-by: NKefeng Wang <wangkefeng.wang@huawei.com>
Reviewed-by: NXiu Jianfeng <xiujianfeng@huawei.com>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
上级 36063a75
...@@ -4556,6 +4556,53 @@ static void mem_cgroup_oom_unregister_event(struct mem_cgroup *memcg, ...@@ -4556,6 +4556,53 @@ static void mem_cgroup_oom_unregister_event(struct mem_cgroup *memcg,
spin_unlock(&memcg_oom_lock); spin_unlock(&memcg_oom_lock);
} }
static const char *const memcg_flag_name[] = {
"NO_REF",
"ONLINE",
"RELEASED",
"VISIBLE",
"DYING"
};
static void memcg_flag_stat_get(int mem_flags, int *stat)
{
int i;
int flags = mem_flags;
for (i = 0; i < ARRAY_SIZE(memcg_flag_name); i++) {
if (flags & 1)
stat[i] += 1;
flags >>= 1;
}
}
static int memcg_flag_stat_show(struct seq_file *sf, void *v)
{
int self_flag[ARRAY_SIZE(memcg_flag_name)];
int child_flag[ARRAY_SIZE(memcg_flag_name)];
int iter;
struct cgroup_subsys_state *child;
struct cgroup_subsys_state *css = seq_css(sf);
memset(self_flag, 0, sizeof(self_flag));
memset(child_flag, 0, sizeof(child_flag));
memcg_flag_stat_get(css->flags, self_flag);
rcu_read_lock();
css_for_each_child(child, css)
memcg_flag_stat_get(child->flags, child_flag);
rcu_read_unlock();
for (iter = 0; iter < ARRAY_SIZE(memcg_flag_name); iter++)
seq_printf(sf, "%s %d\n", memcg_flag_name[iter], self_flag[iter]);
for (iter = 0; iter < ARRAY_SIZE(memcg_flag_name); iter++)
seq_printf(sf, "CHILD_%s %d\n", memcg_flag_name[iter], child_flag[iter]);
return 0;
}
static int mem_cgroup_oom_control_read(struct seq_file *sf, void *v) static int mem_cgroup_oom_control_read(struct seq_file *sf, void *v)
{ {
struct mem_cgroup *memcg = mem_cgroup_from_seq(sf); struct mem_cgroup *memcg = mem_cgroup_from_seq(sf);
...@@ -5259,6 +5306,10 @@ static struct cftype mem_cgroup_legacy_files[] = { ...@@ -5259,6 +5306,10 @@ static struct cftype mem_cgroup_legacy_files[] = {
.write_u64 = mem_cgroup_oom_control_write, .write_u64 = mem_cgroup_oom_control_write,
.private = MEMFILE_PRIVATE(_OOM_TYPE, OOM_CONTROL), .private = MEMFILE_PRIVATE(_OOM_TYPE, OOM_CONTROL),
}, },
{
.name = "flag_stat",
.seq_show = memcg_flag_stat_show,
},
{ {
.name = "pressure_level", .name = "pressure_level",
}, },
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册