diff options
Diffstat (limited to 'mm')
-rw-r--r-- | mm/memcontrol.c | 25 |
1 files changed, 12 insertions, 13 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 8ab84103143..6d59a2bd520 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -600,23 +600,22 @@ static void mem_cgroup_swap_statistics(struct mem_cgroup *mem, | |||
600 | } | 600 | } |
601 | 601 | ||
602 | static void mem_cgroup_charge_statistics(struct mem_cgroup *mem, | 602 | static void mem_cgroup_charge_statistics(struct mem_cgroup *mem, |
603 | struct page_cgroup *pc, | 603 | bool file, int nr_pages) |
604 | bool charge) | ||
605 | { | 604 | { |
606 | int val = (charge) ? 1 : -1; | ||
607 | |||
608 | preempt_disable(); | 605 | preempt_disable(); |
609 | 606 | ||
610 | if (PageCgroupCache(pc)) | 607 | if (file) |
611 | __this_cpu_add(mem->stat->count[MEM_CGROUP_STAT_CACHE], val); | 608 | __this_cpu_add(mem->stat->count[MEM_CGROUP_STAT_CACHE], nr_pages); |
612 | else | 609 | else |
613 | __this_cpu_add(mem->stat->count[MEM_CGROUP_STAT_RSS], val); | 610 | __this_cpu_add(mem->stat->count[MEM_CGROUP_STAT_RSS], nr_pages); |
614 | 611 | ||
615 | if (charge) | 612 | /* pagein of a big page is an event. So, ignore page size */ |
613 | if (nr_pages > 0) | ||
616 | __this_cpu_inc(mem->stat->count[MEM_CGROUP_STAT_PGPGIN_COUNT]); | 614 | __this_cpu_inc(mem->stat->count[MEM_CGROUP_STAT_PGPGIN_COUNT]); |
617 | else | 615 | else |
618 | __this_cpu_inc(mem->stat->count[MEM_CGROUP_STAT_PGPGOUT_COUNT]); | 616 | __this_cpu_inc(mem->stat->count[MEM_CGROUP_STAT_PGPGOUT_COUNT]); |
619 | __this_cpu_inc(mem->stat->count[MEM_CGROUP_EVENTS]); | 617 | |
618 | __this_cpu_add(mem->stat->count[MEM_CGROUP_EVENTS], nr_pages); | ||
620 | 619 | ||
621 | preempt_enable(); | 620 | preempt_enable(); |
622 | } | 621 | } |
@@ -2115,7 +2114,7 @@ static void ____mem_cgroup_commit_charge(struct mem_cgroup *mem, | |||
2115 | break; | 2114 | break; |
2116 | } | 2115 | } |
2117 | 2116 | ||
2118 | mem_cgroup_charge_statistics(mem, pc, true); | 2117 | mem_cgroup_charge_statistics(mem, PageCgroupCache(pc), 1); |
2119 | } | 2118 | } |
2120 | 2119 | ||
2121 | static void __mem_cgroup_commit_charge(struct mem_cgroup *mem, | 2120 | static void __mem_cgroup_commit_charge(struct mem_cgroup *mem, |
@@ -2186,14 +2185,14 @@ static void __mem_cgroup_move_account(struct page_cgroup *pc, | |||
2186 | __this_cpu_inc(to->stat->count[MEM_CGROUP_STAT_FILE_MAPPED]); | 2185 | __this_cpu_inc(to->stat->count[MEM_CGROUP_STAT_FILE_MAPPED]); |
2187 | preempt_enable(); | 2186 | preempt_enable(); |
2188 | } | 2187 | } |
2189 | mem_cgroup_charge_statistics(from, pc, false); | 2188 | mem_cgroup_charge_statistics(from, PageCgroupCache(pc), -1); |
2190 | if (uncharge) | 2189 | if (uncharge) |
2191 | /* This is not "cancel", but cancel_charge does all we need. */ | 2190 | /* This is not "cancel", but cancel_charge does all we need. */ |
2192 | mem_cgroup_cancel_charge(from, PAGE_SIZE); | 2191 | mem_cgroup_cancel_charge(from, PAGE_SIZE); |
2193 | 2192 | ||
2194 | /* caller should have done css_get */ | 2193 | /* caller should have done css_get */ |
2195 | pc->mem_cgroup = to; | 2194 | pc->mem_cgroup = to; |
2196 | mem_cgroup_charge_statistics(to, pc, true); | 2195 | mem_cgroup_charge_statistics(to, PageCgroupCache(pc), 1); |
2197 | /* | 2196 | /* |
2198 | * We charges against "to" which may not have any tasks. Then, "to" | 2197 | * We charges against "to" which may not have any tasks. Then, "to" |
2199 | * can be under rmdir(). But in current implementation, caller of | 2198 | * can be under rmdir(). But in current implementation, caller of |
@@ -2597,7 +2596,7 @@ __mem_cgroup_uncharge_common(struct page *page, enum charge_type ctype) | |||
2597 | } | 2596 | } |
2598 | 2597 | ||
2599 | for (i = 0; i < count; i++) | 2598 | for (i = 0; i < count; i++) |
2600 | mem_cgroup_charge_statistics(mem, pc + i, false); | 2599 | mem_cgroup_charge_statistics(mem, PageCgroupCache(pc), -1); |
2601 | 2600 | ||
2602 | ClearPageCgroupUsed(pc); | 2601 | ClearPageCgroupUsed(pc); |
2603 | /* | 2602 | /* |