|
@@ -713,7 +713,15 @@ static void isolate_freepages(struct zone *zone,
|
|
|
|
|
|
/* Found a block suitable for isolating free pages from */
|
|
|
isolated = 0;
|
|
|
- end_pfn = min(pfn + pageblock_nr_pages, zone_end_pfn);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * As pfn may not start aligned, pfn+pageblock_nr_page
|
|
|
+ * may cross a MAX_ORDER_NR_PAGES boundary and miss
|
|
|
+ * a pfn_valid check. Ensure isolate_freepages_block()
|
|
|
+ * only scans within a pageblock
|
|
|
+ */
|
|
|
+ end_pfn = ALIGN(pfn + 1, pageblock_nr_pages);
|
|
|
+ end_pfn = min(end_pfn, zone_end_pfn);
|
|
|
isolated = isolate_freepages_block(cc, pfn, end_pfn,
|
|
|
freelist, false);
|
|
|
nr_freepages += isolated;
|