diff options
author | Nick Piggin <nickpiggin@yahoo.com.au> | 2005-11-13 19:06:45 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-11-13 21:14:12 -0500 |
commit | 669ed17521b9b78cdbeac8a53c30599aca9527ce (patch) | |
tree | 9a4c037120b7a85943c37115be9f4a6eacb28874 /mm/page_alloc.c | |
parent | 2d6c666e8704cf06267f29a4fa3d2cf823469c38 (diff) |
[PATCH] mm: highmem watermarks
The pages_high - pages_low and pages_low - pages_min deltas are the asynch
reclaim watermarks. As such, the should be in the same ratios as any other
zone for highmem zones. It is the pages_min - 0 delta which is the
PF_MEMALLOC reserve, and this is the region that isn't very useful for
highmem.
This patch ensures highmem systems have similar characteristics as non highmem
ones with the same amount of memory, and also that highmem zones get similar
reclaim pressures to other zones.
Signed-off-by: Nick Piggin <npiggin@suse.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'mm/page_alloc.c')
-rw-r--r-- | mm/page_alloc.c | 27 |
1 files changed, 14 insertions, 13 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 845b91749a42..3c5cf664abd2 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -2397,13 +2397,18 @@ void setup_per_zone_pages_min(void) | |||
2397 | } | 2397 | } |
2398 | 2398 | ||
2399 | for_each_zone(zone) { | 2399 | for_each_zone(zone) { |
2400 | unsigned long tmp; | ||
2400 | spin_lock_irqsave(&zone->lru_lock, flags); | 2401 | spin_lock_irqsave(&zone->lru_lock, flags); |
2402 | tmp = (pages_min * zone->present_pages) / lowmem_pages; | ||
2401 | if (is_highmem(zone)) { | 2403 | if (is_highmem(zone)) { |
2402 | /* | 2404 | /* |
2403 | * Often, highmem doesn't need to reserve any pages. | 2405 | * __GFP_HIGH and PF_MEMALLOC allocations usually don't |
2404 | * But the pages_min/low/high values are also used for | 2406 | * need highmem pages, so cap pages_min to a small |
2405 | * batching up page reclaim activity so we need a | 2407 | * value here. |
2406 | * decent value here. | 2408 | * |
2409 | * The (pages_high-pages_low) and (pages_low-pages_min) | ||
2410 | * deltas controls asynch page reclaim, and so should | ||
2411 | * not be capped for highmem. | ||
2407 | */ | 2412 | */ |
2408 | int min_pages; | 2413 | int min_pages; |
2409 | 2414 | ||
@@ -2414,19 +2419,15 @@ void setup_per_zone_pages_min(void) | |||
2414 | min_pages = 128; | 2419 | min_pages = 128; |
2415 | zone->pages_min = min_pages; | 2420 | zone->pages_min = min_pages; |
2416 | } else { | 2421 | } else { |
2417 | /* if it's a lowmem zone, reserve a number of pages | 2422 | /* |
2423 | * If it's a lowmem zone, reserve a number of pages | ||
2418 | * proportionate to the zone's size. | 2424 | * proportionate to the zone's size. |
2419 | */ | 2425 | */ |
2420 | zone->pages_min = (pages_min * zone->present_pages) / | 2426 | zone->pages_min = tmp; |
2421 | lowmem_pages; | ||
2422 | } | 2427 | } |
2423 | 2428 | ||
2424 | /* | 2429 | zone->pages_low = zone->pages_min + tmp / 4; |
2425 | * When interpreting these watermarks, just keep in mind that: | 2430 | zone->pages_high = zone->pages_min + tmp / 2; |
2426 | * zone->pages_min == (zone->pages_min * 4) / 4; | ||
2427 | */ | ||
2428 | zone->pages_low = (zone->pages_min * 5) / 4; | ||
2429 | zone->pages_high = (zone->pages_min * 6) / 4; | ||
2430 | spin_unlock_irqrestore(&zone->lru_lock, flags); | 2431 | spin_unlock_irqrestore(&zone->lru_lock, flags); |
2431 | } | 2432 | } |
2432 | } | 2433 | } |