diff options
-rw-r--r-- | include/linux/memcontrol.h | 15 | ||||
-rw-r--r-- | mm/memcontrol.c | 33 |
2 files changed, 48 insertions, 0 deletions
diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index f82158faa494..d87090eb14c0 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h | |||
@@ -76,6 +76,10 @@ extern void mem_cgroup_note_reclaim_priority(struct mem_cgroup *mem, | |||
76 | extern void mem_cgroup_record_reclaim_priority(struct mem_cgroup *mem, | 76 | extern void mem_cgroup_record_reclaim_priority(struct mem_cgroup *mem, |
77 | int priority); | 77 | int priority); |
78 | 78 | ||
79 | extern long mem_cgroup_calc_reclaim_active(struct mem_cgroup *mem, | ||
80 | struct zone *zone, int priority); | ||
81 | extern long mem_cgroup_calc_reclaim_inactive(struct mem_cgroup *mem, | ||
82 | struct zone *zone, int priority); | ||
79 | 83 | ||
80 | #else /* CONFIG_CGROUP_MEM_CONT */ | 84 | #else /* CONFIG_CGROUP_MEM_CONT */ |
81 | static inline void mm_init_cgroup(struct mm_struct *mm, | 85 | static inline void mm_init_cgroup(struct mm_struct *mm, |
@@ -173,6 +177,17 @@ static inline void mem_cgroup_record_reclaim_priority(struct mem_cgroup *mem, | |||
173 | { | 177 | { |
174 | } | 178 | } |
175 | 179 | ||
180 | static inline long mem_cgroup_calc_reclaim_active(struct mem_cgroup *mem, | ||
181 | struct zone *zone, int priority) | ||
182 | { | ||
183 | return 0; | ||
184 | } | ||
185 | |||
186 | static inline long mem_cgroup_calc_reclaim_inactive(struct mem_cgroup *mem, | ||
187 | struct zone *zone, int priority) | ||
188 | { | ||
189 | return 0; | ||
190 | } | ||
176 | #endif /* CONFIG_CGROUP_MEM_CONT */ | 191 | #endif /* CONFIG_CGROUP_MEM_CONT */ |
177 | 192 | ||
178 | #endif /* _LINUX_MEMCONTROL_H */ | 193 | #endif /* _LINUX_MEMCONTROL_H */ |
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index f8a6a39c440d..40cdba68de34 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -471,6 +471,39 @@ void mem_cgroup_record_reclaim_priority(struct mem_cgroup *mem, int priority) | |||
471 | mem->prev_priority = priority; | 471 | mem->prev_priority = priority; |
472 | } | 472 | } |
473 | 473 | ||
474 | /* | ||
475 | * Calculate # of pages to be scanned in this priority/zone. | ||
476 | * See also vmscan.c | ||
477 | * | ||
478 | * priority starts from "DEF_PRIORITY" and decremented in each loop. | ||
479 | * (see include/linux/mmzone.h) | ||
480 | */ | ||
481 | |||
482 | long mem_cgroup_calc_reclaim_active(struct mem_cgroup *mem, | ||
483 | struct zone *zone, int priority) | ||
484 | { | ||
485 | long nr_active; | ||
486 | int nid = zone->zone_pgdat->node_id; | ||
487 | int zid = zone_idx(zone); | ||
488 | struct mem_cgroup_per_zone *mz = mem_cgroup_zoneinfo(mem, nid, zid); | ||
489 | |||
490 | nr_active = MEM_CGROUP_ZSTAT(mz, MEM_CGROUP_ZSTAT_ACTIVE); | ||
491 | return (nr_active >> priority); | ||
492 | } | ||
493 | |||
494 | long mem_cgroup_calc_reclaim_inactive(struct mem_cgroup *mem, | ||
495 | struct zone *zone, int priority) | ||
496 | { | ||
497 | long nr_inactive; | ||
498 | int nid = zone->zone_pgdat->node_id; | ||
499 | int zid = zone_idx(zone); | ||
500 | struct mem_cgroup_per_zone *mz = mem_cgroup_zoneinfo(mem, nid, zid); | ||
501 | |||
502 | nr_inactive = MEM_CGROUP_ZSTAT(mz, MEM_CGROUP_ZSTAT_INACTIVE); | ||
503 | |||
504 | return (nr_inactive >> priority); | ||
505 | } | ||
506 | |||
474 | unsigned long mem_cgroup_isolate_pages(unsigned long nr_to_scan, | 507 | unsigned long mem_cgroup_isolate_pages(unsigned long nr_to_scan, |
475 | struct list_head *dst, | 508 | struct list_head *dst, |
476 | unsigned long *scanned, int order, | 509 | unsigned long *scanned, int order, |