Commit 1dd3a273 authored by Daisuke Nishimura's avatar Daisuke Nishimura Committed by Linus Torvalds

memcg: show swap usage in stat file

We now count MEM_CGROUP_STAT_SWAPOUT, so we can show swap usage.  It would
be useful for users to show swap usage in memory.stat file, because they
don't need calculate memsw.usage - res.usage to know swap usage.
Signed-off-by: default avatarDaisuke Nishimura <nishimura@mxp.nes.nec.co.jp>
Reviewed-by: default avatarKAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Reviewed-by: default avatarBalbir Singh <balbir@linux.vnet.ibm.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 0c3e73e8
...@@ -2676,6 +2676,7 @@ enum { ...@@ -2676,6 +2676,7 @@ enum {
MCS_MAPPED_FILE, MCS_MAPPED_FILE,
MCS_PGPGIN, MCS_PGPGIN,
MCS_PGPGOUT, MCS_PGPGOUT,
MCS_SWAP,
MCS_INACTIVE_ANON, MCS_INACTIVE_ANON,
MCS_ACTIVE_ANON, MCS_ACTIVE_ANON,
MCS_INACTIVE_FILE, MCS_INACTIVE_FILE,
...@@ -2697,6 +2698,7 @@ struct { ...@@ -2697,6 +2698,7 @@ struct {
{"mapped_file", "total_mapped_file"}, {"mapped_file", "total_mapped_file"},
{"pgpgin", "total_pgpgin"}, {"pgpgin", "total_pgpgin"},
{"pgpgout", "total_pgpgout"}, {"pgpgout", "total_pgpgout"},
{"swap", "total_swap"},
{"inactive_anon", "total_inactive_anon"}, {"inactive_anon", "total_inactive_anon"},
{"active_anon", "total_active_anon"}, {"active_anon", "total_active_anon"},
{"inactive_file", "total_inactive_file"}, {"inactive_file", "total_inactive_file"},
...@@ -2721,6 +2723,10 @@ static int mem_cgroup_get_local_stat(struct mem_cgroup *mem, void *data) ...@@ -2721,6 +2723,10 @@ static int mem_cgroup_get_local_stat(struct mem_cgroup *mem, void *data)
s->stat[MCS_PGPGIN] += val; s->stat[MCS_PGPGIN] += val;
val = mem_cgroup_read_stat(&mem->stat, MEM_CGROUP_STAT_PGPGOUT_COUNT); val = mem_cgroup_read_stat(&mem->stat, MEM_CGROUP_STAT_PGPGOUT_COUNT);
s->stat[MCS_PGPGOUT] += val; s->stat[MCS_PGPGOUT] += val;
if (do_swap_account) {
val = mem_cgroup_read_stat(&mem->stat, MEM_CGROUP_STAT_SWAPOUT);
s->stat[MCS_SWAP] += val * PAGE_SIZE;
}
/* per zone stat */ /* per zone stat */
val = mem_cgroup_get_local_zonestat(mem, LRU_INACTIVE_ANON); val = mem_cgroup_get_local_zonestat(mem, LRU_INACTIVE_ANON);
...@@ -2752,8 +2758,11 @@ static int mem_control_stat_show(struct cgroup *cont, struct cftype *cft, ...@@ -2752,8 +2758,11 @@ static int mem_control_stat_show(struct cgroup *cont, struct cftype *cft,
memset(&mystat, 0, sizeof(mystat)); memset(&mystat, 0, sizeof(mystat));
mem_cgroup_get_local_stat(mem_cont, &mystat); mem_cgroup_get_local_stat(mem_cont, &mystat);
for (i = 0; i < NR_MCS_STAT; i++) for (i = 0; i < NR_MCS_STAT; i++) {
if (i == MCS_SWAP && !do_swap_account)
continue;
cb->fill(cb, memcg_stat_strings[i].local_name, mystat.stat[i]); cb->fill(cb, memcg_stat_strings[i].local_name, mystat.stat[i]);
}
/* Hierarchical information */ /* Hierarchical information */
{ {
...@@ -2766,9 +2775,11 @@ static int mem_control_stat_show(struct cgroup *cont, struct cftype *cft, ...@@ -2766,9 +2775,11 @@ static int mem_control_stat_show(struct cgroup *cont, struct cftype *cft,
memset(&mystat, 0, sizeof(mystat)); memset(&mystat, 0, sizeof(mystat));
mem_cgroup_get_total_stat(mem_cont, &mystat); mem_cgroup_get_total_stat(mem_cont, &mystat);
for (i = 0; i < NR_MCS_STAT; i++) for (i = 0; i < NR_MCS_STAT; i++) {
if (i == MCS_SWAP && !do_swap_account)
continue;
cb->fill(cb, memcg_stat_strings[i].total_name, mystat.stat[i]); cb->fill(cb, memcg_stat_strings[i].total_name, mystat.stat[i]);
}
#ifdef CONFIG_DEBUG_VM #ifdef CONFIG_DEBUG_VM
cb->fill(cb, "inactive_ratio", calc_inactive_ratio(mem_cont, NULL)); cb->fill(cb, "inactive_ratio", calc_inactive_ratio(mem_cont, NULL));
......
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