diff options
author | Minchan Kim <minchan.kim@gmail.com> | 2009-06-16 18:32:50 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-16 22:47:42 -0400 |
commit | bce7394a3ef82b8477952fbab838e4a6e8cb47d2 (patch) | |
tree | 7e2f50300dc4edf471a67c1871f288f031fd84f7 | |
parent | 96cb4df5ddf5e6d5785b5acd4003e3689b87f896 (diff) |
page-allocator: reset wmark_min and inactive ratio of zone when hotplug happens
Solve two problems.
Whenever memory hotplug sucessfully happens, zone->present_pages
have to be changed.
1) Now memory hotplug calls setup_per_zone_wmark_min only when
online_pages called, not offline_pages.
It breaks balance.
2) If zone->present_pages is changed, we also have to change
zone->inactive_ratio. That's because inactive_ratio depends on
zone->present_pages.
Signed-off-by: Minchan Kim <minchan.kim@gmail.com>
Acked-by: Yasunori Goto <y-goto@jp.fujitsu.com>
Cc: Rik van Riel <riel@redhat.com>
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | mm/memory_hotplug.c | 4 | ||||
-rw-r--r-- | mm/page_alloc.c | 2 |
2 files changed, 5 insertions, 1 deletions
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index 037291e15b27..e4412a676c88 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c | |||
@@ -423,6 +423,7 @@ int online_pages(unsigned long pfn, unsigned long nr_pages) | |||
423 | zone->zone_pgdat->node_present_pages += onlined_pages; | 423 | zone->zone_pgdat->node_present_pages += onlined_pages; |
424 | 424 | ||
425 | setup_per_zone_wmarks(); | 425 | setup_per_zone_wmarks(); |
426 | calculate_zone_inactive_ratio(zone); | ||
426 | if (onlined_pages) { | 427 | if (onlined_pages) { |
427 | kswapd_run(zone_to_nid(zone)); | 428 | kswapd_run(zone_to_nid(zone)); |
428 | node_set_state(zone_to_nid(zone), N_HIGH_MEMORY); | 429 | node_set_state(zone_to_nid(zone), N_HIGH_MEMORY); |
@@ -832,6 +833,9 @@ repeat: | |||
832 | totalram_pages -= offlined_pages; | 833 | totalram_pages -= offlined_pages; |
833 | num_physpages -= offlined_pages; | 834 | num_physpages -= offlined_pages; |
834 | 835 | ||
836 | setup_per_zone_wmarks(); | ||
837 | calculate_zone_inactive_ratio(zone); | ||
838 | |||
835 | vm_total_pages = nr_free_pagecache_pages(); | 839 | vm_total_pages = nr_free_pagecache_pages(); |
836 | writeback_set_ratelimit(); | 840 | writeback_set_ratelimit(); |
837 | 841 | ||
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 303607f1d323..00e293734fc9 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -4397,7 +4397,7 @@ static void setup_per_zone_lowmem_reserve(void) | |||
4397 | 4397 | ||
4398 | /** | 4398 | /** |
4399 | * setup_per_zone_wmarks - called when min_free_kbytes changes | 4399 | * setup_per_zone_wmarks - called when min_free_kbytes changes |
4400 | * or when memory is hot-added | 4400 | * or when memory is hot-{added|removed} |
4401 | * | 4401 | * |
4402 | * Ensures that the watermark[min,low,high] values for each zone are set | 4402 | * Ensures that the watermark[min,low,high] values for each zone are set |
4403 | * correctly with respect to min_free_kbytes. | 4403 | * correctly with respect to min_free_kbytes. |