diff options
author | KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> | 2008-02-07 03:14:35 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-02-07 11:42:22 -0500 |
commit | cc38108e1ba7f3b9e12b82d0236fa3730c2e0439 (patch) | |
tree | 6e51d191006b5db840c1eee659c372a2de7f85a8 | |
parent | 6c48a1d040a9a9eaa4acdd7d4cb3885e04bf8413 (diff) |
per-zone and reclaim enhancements for memory controller: calculate the number of pages to be scanned per cgroup
Define function for calculating the number of scan target on each Zone/LRU.
Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Cc: Balbir Singh <balbir@linux.vnet.ibm.com>
Cc: David Rientjes <rientjes@google.com>
Cc: Herbert Poetzl <herbert@13thfloor.at>
Cc: Kirill Korotaev <dev@sw.ru>
Cc: Nick Piggin <nickpiggin@yahoo.com.au>
Cc: Paul Menage <menage@google.com>
Cc: Pavel Emelianov <xemul@openvz.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Vaidyanathan Srinivasan <svaidy@linux.vnet.ibm.com>
Cc: Rik van Riel <riel@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-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, |