diff options
author | Jiang Liu <jiang.liu@huawei.com> | 2012-07-31 19:43:32 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-07-31 21:42:44 -0400 |
commit | 340175b7d14d5617559d0c1a54fa0ea204d9edcd (patch) | |
tree | 7b2fb51d5bf1e54bf258a058fea347ee2d75ac7b /mm | |
parent | 08dff7b7d629807dbb1f398c68dd9cd58dd657a1 (diff) |
mm/hotplug: free zone->pageset when a zone becomes empty
When a zone becomes empty after memory offlining, free zone->pageset.
Otherwise it will cause memory leak when adding memory to the empty zone
again because build_all_zonelists() will allocate zone->pageset for an
empty zone.
Signed-off-by: Jiang Liu <liuj97@gmail.com>
Signed-off-by: Wei Wang <Bessel.Wang@huawei.com>
Cc: Mel Gorman <mgorman@suse.de>
Cc: Michal Hocko <mhocko@suse.cz>
Cc: Minchan Kim <minchan@kernel.org>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Cc: Yinghai Lu <yinghai@kernel.org>
Cc: Tony Luck <tony.luck@intel.com>
Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Cc: David Rientjes <rientjes@google.com>
Cc: Keping Chen <chenkeping@huawei.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm')
-rw-r--r-- | mm/memory_hotplug.c | 3 | ||||
-rw-r--r-- | mm/page_alloc.c | 13 |
2 files changed, 16 insertions, 0 deletions
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index 597d371329d3..3ad25f9d1fc1 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c | |||
@@ -966,6 +966,9 @@ repeat: | |||
966 | 966 | ||
967 | init_per_zone_wmark_min(); | 967 | init_per_zone_wmark_min(); |
968 | 968 | ||
969 | if (!populated_zone(zone)) | ||
970 | zone_pcp_reset(zone); | ||
971 | |||
969 | if (!node_present_pages(node)) { | 972 | if (!node_present_pages(node)) { |
970 | node_clear_state(node, N_HIGH_MEMORY); | 973 | node_clear_state(node, N_HIGH_MEMORY); |
971 | kswapd_stop(node); | 974 | kswapd_stop(node); |
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 9ad6866ac49c..9c9a31665a78 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -5894,6 +5894,19 @@ void free_contig_range(unsigned long pfn, unsigned nr_pages) | |||
5894 | #endif | 5894 | #endif |
5895 | 5895 | ||
5896 | #ifdef CONFIG_MEMORY_HOTREMOVE | 5896 | #ifdef CONFIG_MEMORY_HOTREMOVE |
5897 | void zone_pcp_reset(struct zone *zone) | ||
5898 | { | ||
5899 | unsigned long flags; | ||
5900 | |||
5901 | /* avoid races with drain_pages() */ | ||
5902 | local_irq_save(flags); | ||
5903 | if (zone->pageset != &boot_pageset) { | ||
5904 | free_percpu(zone->pageset); | ||
5905 | zone->pageset = &boot_pageset; | ||
5906 | } | ||
5907 | local_irq_restore(flags); | ||
5908 | } | ||
5909 | |||
5897 | /* | 5910 | /* |
5898 | * All pages in the range must be isolated before calling this. | 5911 | * All pages in the range must be isolated before calling this. |
5899 | */ | 5912 | */ |