diff options
author | Michal Hocko <mhocko@suse.cz> | 2012-01-20 17:33:58 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-01-23 11:38:47 -0500 |
commit | 656a070629adfe23c12768e35ddf91feab469ff7 (patch) | |
tree | 42c001d079ec926186873b91d7d84bf66c54bcad /mm/page_alloc.c | |
parent | 687875fb7de4a95223af20ee024282fa9099f860 (diff) |
mm: __count_immobile_pages(): make sure the node is online
page_zone() requires an online node otherwise we are accessing NULL
NODE_DATA. This is not an issue at the moment because node_zones are
located at the structure beginning but this might change in the future
so better be careful about that.
Signed-off-by: Michal Hocko <mhocko@suse.cz>
Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Acked-by: Mel Gorman <mgorman@suse.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/page_alloc.c')
-rw-r--r-- | mm/page_alloc.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 21c272d517bc..d2186ecb36f7 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -5413,15 +5413,22 @@ __count_immobile_pages(struct zone *zone, struct page *page, int count) | |||
5413 | 5413 | ||
5414 | bool is_pageblock_removable_nolock(struct page *page) | 5414 | bool is_pageblock_removable_nolock(struct page *page) |
5415 | { | 5415 | { |
5416 | struct zone *zone = page_zone(page); | 5416 | struct zone *zone; |
5417 | unsigned long pfn = page_to_pfn(page); | 5417 | unsigned long pfn; |
5418 | 5418 | ||
5419 | /* | 5419 | /* |
5420 | * We have to be careful here because we are iterating over memory | 5420 | * We have to be careful here because we are iterating over memory |
5421 | * sections which are not zone aware so we might end up outside of | 5421 | * sections which are not zone aware so we might end up outside of |
5422 | * the zone but still within the section. | 5422 | * the zone but still within the section. |
5423 | * We have to take care about the node as well. If the node is offline | ||
5424 | * its NODE_DATA will be NULL - see page_zone. | ||
5423 | */ | 5425 | */ |
5424 | if (!zone || zone->zone_start_pfn > pfn || | 5426 | if (!node_online(page_to_nid(page))) |
5427 | return false; | ||
5428 | |||
5429 | zone = page_zone(page); | ||
5430 | pfn = page_to_pfn(page); | ||
5431 | if (zone->zone_start_pfn > pfn || | ||
5425 | zone->zone_start_pfn + zone->spanned_pages <= pfn) | 5432 | zone->zone_start_pfn + zone->spanned_pages <= pfn) |
5426 | return false; | 5433 | return false; |
5427 | 5434 | ||