|
@@ -2676,6 +2676,7 @@ enum {
|
|
|
MCS_MAPPED_FILE,
|
|
|
MCS_PGPGIN,
|
|
|
MCS_PGPGOUT,
|
|
|
+ MCS_SWAP,
|
|
|
MCS_INACTIVE_ANON,
|
|
|
MCS_ACTIVE_ANON,
|
|
|
MCS_INACTIVE_FILE,
|
|
@@ -2697,6 +2698,7 @@ struct {
|
|
|
{"mapped_file", "total_mapped_file"},
|
|
|
{"pgpgin", "total_pgpgin"},
|
|
|
{"pgpgout", "total_pgpgout"},
|
|
|
+ {"swap", "total_swap"},
|
|
|
{"inactive_anon", "total_inactive_anon"},
|
|
|
{"active_anon", "total_active_anon"},
|
|
|
{"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;
|
|
|
val = mem_cgroup_read_stat(&mem->stat, MEM_CGROUP_STAT_PGPGOUT_COUNT);
|
|
|
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 */
|
|
|
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));
|
|
|
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]);
|
|
|
+ }
|
|
|
|
|
|
/* Hierarchical information */
|
|
|
{
|
|
@@ -2766,9 +2775,11 @@ static int mem_control_stat_show(struct cgroup *cont, struct cftype *cft,
|
|
|
|
|
|
memset(&mystat, 0, sizeof(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]);
|
|
|
-
|
|
|
+ }
|
|
|
|
|
|
#ifdef CONFIG_DEBUG_VM
|
|
|
cb->fill(cb, "inactive_ratio", calc_inactive_ratio(mem_cont, NULL));
|