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: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp>
Reviewed-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Reviewed-by: Balbir Singh <balbir@linux.vnet.ibm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Daisuke Nishimura 2009-09-23 15:56:43 -07:00 committed by Linus Torvalds
parent 0c3e73e84f
commit 1dd3a27326

View file

@ -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 {
{"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)
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,
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,
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));