mirror of
https://github.com/adulau/aha.git
synced 2024-12-28 03:36:19 +00:00
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:
parent
0c3e73e84f
commit
1dd3a27326
1 changed files with 14 additions and 3 deletions
|
@ -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));
|
||||||
|
|
Loading…
Reference in a new issue