From 828b5b359ac53783e1f521bc99d311a68dc87b93 Mon Sep 17 00:00:00 2001 From: Michal Hocko Date: Fri, 20 Jan 2012 14:33:58 -0800 Subject: [PATCH] --- yaml --- r: 286595 b: refs/heads/master c: 656a070629adfe23c12768e35ddf91feab469ff7 h: refs/heads/master i: 286593: fcd5a1958a905fd2735fe803f2e574469836fdc9 286591: 76420a988489bc021be088ebf3cb7386801e2f3b v: v3 --- [refs] | 2 +- trunk/mm/page_alloc.c | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index 122ec76e7b97..d737cd3abda5 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 687875fb7de4a95223af20ee024282fa9099f860 +refs/heads/master: 656a070629adfe23c12768e35ddf91feab469ff7 diff --git a/trunk/mm/page_alloc.c b/trunk/mm/page_alloc.c index 21c272d517bc..d2186ecb36f7 100644 --- a/trunk/mm/page_alloc.c +++ b/trunk/mm/page_alloc.c @@ -5413,15 +5413,22 @@ __count_immobile_pages(struct zone *zone, struct page *page, int count) bool is_pageblock_removable_nolock(struct page *page) { - struct zone *zone = page_zone(page); - unsigned long pfn = page_to_pfn(page); + struct zone *zone; + unsigned long pfn; /* * We have to be careful here because we are iterating over memory * sections which are not zone aware so we might end up outside of * the zone but still within the section. + * We have to take care about the node as well. If the node is offline + * its NODE_DATA will be NULL - see page_zone. */ - if (!zone || zone->zone_start_pfn > pfn || + if (!node_online(page_to_nid(page))) + return false; + + zone = page_zone(page); + pfn = page_to_pfn(page); + if (zone->zone_start_pfn > pfn || zone->zone_start_pfn + zone->spanned_pages <= pfn) return false;