[PATCH 3/3] mm, meminit: Ensure node is online before checking whether pages are uninitialised

From: Mel Gorman
Date: Fri Jul 08 2016 - 16:00:54 EST


early_page_uninitialised looks up an arbitrary PFN. While a machine without
node 0 will boot with "mm, page_alloc: Always return a valid node from
early_pfn_to_nid", it works because it assumes that nodes are always in
PFN order. This is not guaranteed so this patch adds robustness by always
checking if the node being checked is online.

Signed-off-by: Mel Gorman <mgorman@xxxxxxxxxxxxxxxxxxx>
Cc: <stable@xxxxxxxxxxxxxxx> # 4.2+
---
mm/page_alloc.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 5a616de1adca..03c9322da942 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -286,7 +286,9 @@ static inline void reset_deferred_meminit(pg_data_t *pgdat)
/* Returns true if the struct page for the pfn is uninitialised */
static inline bool __meminit early_page_uninitialised(unsigned long pfn)
{
- if (pfn >= NODE_DATA(early_pfn_to_nid(pfn))->first_deferred_pfn)
+ int nid = early_pfn_to_nid(pfn);
+
+ if (node_online(nid) && pfn >= NODE_DATA(nid)->first_deferred_pfn)
return true;

return false;
--
2.6.4