Commit 791badbd authored by Tejun Heo's avatar Tejun Heo

memcg: convert away from cftype->read() and ->read_map()

In preparation of conversion to kernfs, cgroup file handling is being
consolidated so that it can be easily mapped to the seq_file based
interface of kernfs.

cftype->read_map() doesn't add any value and being replaced with
->read_seq_string(), and all users of cftype->read() can be easily
served, usually better, by seq_file and other methods.

Update mem_cgroup_read() to return u64 instead of printing itself and
rename it to mem_cgroup_read_u64(), and update
mem_cgroup_oom_control_read() to use ->read_seq_string() instead of
->read_map().

This patch doesn't make any visible behavior changes.
Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Acked-by: default avatarMichal Hocko <mhocko@suse.cz>
Acked-by: default avatarLi Zefan <lizefan@huawei.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Balbir Singh <bsingharora@gmail.com>
Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
parent 51ffe411
...@@ -5150,14 +5150,12 @@ static inline u64 mem_cgroup_usage(struct mem_cgroup *memcg, bool swap) ...@@ -5150,14 +5150,12 @@ static inline u64 mem_cgroup_usage(struct mem_cgroup *memcg, bool swap)
return val << PAGE_SHIFT; return val << PAGE_SHIFT;
} }
static ssize_t mem_cgroup_read(struct cgroup_subsys_state *css, static u64 mem_cgroup_read_u64(struct cgroup_subsys_state *css,
struct cftype *cft, struct file *file, struct cftype *cft)
char __user *buf, size_t nbytes, loff_t *ppos)
{ {
struct mem_cgroup *memcg = mem_cgroup_from_css(css); struct mem_cgroup *memcg = mem_cgroup_from_css(css);
char str[64];
u64 val; u64 val;
int name, len; int name;
enum res_type type; enum res_type type;
type = MEMFILE_TYPE(cft->private); type = MEMFILE_TYPE(cft->private);
...@@ -5183,8 +5181,7 @@ static ssize_t mem_cgroup_read(struct cgroup_subsys_state *css, ...@@ -5183,8 +5181,7 @@ static ssize_t mem_cgroup_read(struct cgroup_subsys_state *css,
BUG(); BUG();
} }
len = scnprintf(str, sizeof(str), "%llu\n", (unsigned long long)val); return val;
return simple_read_from_buffer(buf, nbytes, ppos, str, len);
} }
static int memcg_update_kmem_limit(struct cgroup_subsys_state *css, u64 val) static int memcg_update_kmem_limit(struct cgroup_subsys_state *css, u64 val)
...@@ -5911,16 +5908,12 @@ static void mem_cgroup_oom_unregister_event(struct mem_cgroup *memcg, ...@@ -5911,16 +5908,12 @@ static void mem_cgroup_oom_unregister_event(struct mem_cgroup *memcg,
} }
static int mem_cgroup_oom_control_read(struct cgroup_subsys_state *css, static int mem_cgroup_oom_control_read(struct cgroup_subsys_state *css,
struct cftype *cft, struct cgroup_map_cb *cb) struct cftype *cft, struct seq_file *sf)
{ {
struct mem_cgroup *memcg = mem_cgroup_from_css(css); struct mem_cgroup *memcg = mem_cgroup_from_css(css);
cb->fill(cb, "oom_kill_disable", memcg->oom_kill_disable); seq_printf(sf, "oom_kill_disable %d\n", memcg->oom_kill_disable);
seq_printf(sf, "under_oom %d\n", (bool)atomic_read(&memcg->under_oom));
if (atomic_read(&memcg->under_oom))
cb->fill(cb, "under_oom", 1);
else
cb->fill(cb, "under_oom", 0);
return 0; return 0;
} }
...@@ -6239,31 +6232,31 @@ static struct cftype mem_cgroup_files[] = { ...@@ -6239,31 +6232,31 @@ static struct cftype mem_cgroup_files[] = {
{ {
.name = "usage_in_bytes", .name = "usage_in_bytes",
.private = MEMFILE_PRIVATE(_MEM, RES_USAGE), .private = MEMFILE_PRIVATE(_MEM, RES_USAGE),
.read = mem_cgroup_read, .read_u64 = mem_cgroup_read_u64,
}, },
{ {
.name = "max_usage_in_bytes", .name = "max_usage_in_bytes",
.private = MEMFILE_PRIVATE(_MEM, RES_MAX_USAGE), .private = MEMFILE_PRIVATE(_MEM, RES_MAX_USAGE),
.trigger = mem_cgroup_reset, .trigger = mem_cgroup_reset,
.read = mem_cgroup_read, .read_u64 = mem_cgroup_read_u64,
}, },
{ {
.name = "limit_in_bytes", .name = "limit_in_bytes",
.private = MEMFILE_PRIVATE(_MEM, RES_LIMIT), .private = MEMFILE_PRIVATE(_MEM, RES_LIMIT),
.write_string = mem_cgroup_write, .write_string = mem_cgroup_write,
.read = mem_cgroup_read, .read_u64 = mem_cgroup_read_u64,
}, },
{ {
.name = "soft_limit_in_bytes", .name = "soft_limit_in_bytes",
.private = MEMFILE_PRIVATE(_MEM, RES_SOFT_LIMIT), .private = MEMFILE_PRIVATE(_MEM, RES_SOFT_LIMIT),
.write_string = mem_cgroup_write, .write_string = mem_cgroup_write,
.read = mem_cgroup_read, .read_u64 = mem_cgroup_read_u64,
}, },
{ {
.name = "failcnt", .name = "failcnt",
.private = MEMFILE_PRIVATE(_MEM, RES_FAILCNT), .private = MEMFILE_PRIVATE(_MEM, RES_FAILCNT),
.trigger = mem_cgroup_reset, .trigger = mem_cgroup_reset,
.read = mem_cgroup_read, .read_u64 = mem_cgroup_read_u64,
}, },
{ {
.name = "stat", .name = "stat",
...@@ -6297,7 +6290,7 @@ static struct cftype mem_cgroup_files[] = { ...@@ -6297,7 +6290,7 @@ static struct cftype mem_cgroup_files[] = {
}, },
{ {
.name = "oom_control", .name = "oom_control",
.read_map = mem_cgroup_oom_control_read, .read_seq_string = mem_cgroup_oom_control_read,
.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),
}, },
...@@ -6315,24 +6308,24 @@ static struct cftype mem_cgroup_files[] = { ...@@ -6315,24 +6308,24 @@ static struct cftype mem_cgroup_files[] = {
.name = "kmem.limit_in_bytes", .name = "kmem.limit_in_bytes",
.private = MEMFILE_PRIVATE(_KMEM, RES_LIMIT), .private = MEMFILE_PRIVATE(_KMEM, RES_LIMIT),
.write_string = mem_cgroup_write, .write_string = mem_cgroup_write,
.read = mem_cgroup_read, .read_u64 = mem_cgroup_read_u64,
}, },
{ {
.name = "kmem.usage_in_bytes", .name = "kmem.usage_in_bytes",
.private = MEMFILE_PRIVATE(_KMEM, RES_USAGE), .private = MEMFILE_PRIVATE(_KMEM, RES_USAGE),
.read = mem_cgroup_read, .read_u64 = mem_cgroup_read_u64,
}, },
{ {
.name = "kmem.failcnt", .name = "kmem.failcnt",
.private = MEMFILE_PRIVATE(_KMEM, RES_FAILCNT), .private = MEMFILE_PRIVATE(_KMEM, RES_FAILCNT),
.trigger = mem_cgroup_reset, .trigger = mem_cgroup_reset,
.read = mem_cgroup_read, .read_u64 = mem_cgroup_read_u64,
}, },
{ {
.name = "kmem.max_usage_in_bytes", .name = "kmem.max_usage_in_bytes",
.private = MEMFILE_PRIVATE(_KMEM, RES_MAX_USAGE), .private = MEMFILE_PRIVATE(_KMEM, RES_MAX_USAGE),
.trigger = mem_cgroup_reset, .trigger = mem_cgroup_reset,
.read = mem_cgroup_read, .read_u64 = mem_cgroup_read_u64,
}, },
#ifdef CONFIG_SLABINFO #ifdef CONFIG_SLABINFO
{ {
...@@ -6349,25 +6342,25 @@ static struct cftype memsw_cgroup_files[] = { ...@@ -6349,25 +6342,25 @@ static struct cftype memsw_cgroup_files[] = {
{ {
.name = "memsw.usage_in_bytes", .name = "memsw.usage_in_bytes",
.private = MEMFILE_PRIVATE(_MEMSWAP, RES_USAGE), .private = MEMFILE_PRIVATE(_MEMSWAP, RES_USAGE),
.read = mem_cgroup_read, .read_u64 = mem_cgroup_read_u64,
}, },
{ {
.name = "memsw.max_usage_in_bytes", .name = "memsw.max_usage_in_bytes",
.private = MEMFILE_PRIVATE(_MEMSWAP, RES_MAX_USAGE), .private = MEMFILE_PRIVATE(_MEMSWAP, RES_MAX_USAGE),
.trigger = mem_cgroup_reset, .trigger = mem_cgroup_reset,
.read = mem_cgroup_read, .read_u64 = mem_cgroup_read_u64,
}, },
{ {
.name = "memsw.limit_in_bytes", .name = "memsw.limit_in_bytes",
.private = MEMFILE_PRIVATE(_MEMSWAP, RES_LIMIT), .private = MEMFILE_PRIVATE(_MEMSWAP, RES_LIMIT),
.write_string = mem_cgroup_write, .write_string = mem_cgroup_write,
.read = mem_cgroup_read, .read_u64 = mem_cgroup_read_u64,
}, },
{ {
.name = "memsw.failcnt", .name = "memsw.failcnt",
.private = MEMFILE_PRIVATE(_MEMSWAP, RES_FAILCNT), .private = MEMFILE_PRIVATE(_MEMSWAP, RES_FAILCNT),
.trigger = mem_cgroup_reset, .trigger = mem_cgroup_reset,
.read = mem_cgroup_read, .read_u64 = mem_cgroup_read_u64,
}, },
{ }, /* terminate */ { }, /* terminate */
}; };
......
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