@@ -4491,6 +4491,33 @@ void __init set_pageblock_order(void)
#endif /* CONFIG_HUGETLB_PAGE_SIZE_VARIABLE */
+#define REGIONS_SIZE (512 << 20) >> PAGE_SHIFT
+
+static void init_node_memory_regions(struct pglist_data *pgdat)
+{
+ int cnt = 0;
+ unsigned long i;
+ unsigned long start_pfn = pgdat->node_start_pfn;
+ unsigned long spanned_pages = pgdat->node_spanned_pages;
+ unsigned long total = 0;
+
+ for (i = start_pfn; i < start_pfn + spanned_pages; i += REGIONS_SIZE) {
+ struct mem_region *region = &pgdat->node_regions[cnt];
+
+ region->start_pfn = i;
+ if ((spanned_pages - total) < REGIONS_SIZE)
+ region->spanned_pages = spanned_pages - total;
+ else
+ region->spanned_pages = REGIONS_SIZE;
+
+ region->node = pgdat->node_id;
+ region->region = cnt;
+ pgdat->nr_node_regions++;
+ total += region->spanned_pages;
+ cnt++;
+ }
+}
+
/*
* Set up the zone data structures:
* - mark all pages reserved
@@ -4653,6 +4680,7 @@ void __paginginit free_area_init_node(int nid, unsigned long *zones_size,
(unsigned long)pgdat->node_mem_map);
#endif
+ init_node_memory_regions(pgdat);
free_area_init_core(pgdat, zones_size, zholes_size);
}