|
@@ -4420,10 +4420,11 @@ static void __meminit calculate_node_totalpages(struct pglist_data *pgdat,
|
|
|
* round what is now in bits to nearest long in bits, then return it in
|
|
|
* bytes.
|
|
|
*/
|
|
|
-static unsigned long __init usemap_size(unsigned long zonesize)
|
|
|
+static unsigned long __init usemap_size(unsigned long zone_start_pfn, unsigned long zonesize)
|
|
|
{
|
|
|
unsigned long usemapsize;
|
|
|
|
|
|
+ zonesize += zone_start_pfn & (pageblock_nr_pages-1);
|
|
|
usemapsize = roundup(zonesize, pageblock_nr_pages);
|
|
|
usemapsize = usemapsize >> pageblock_order;
|
|
|
usemapsize *= NR_PAGEBLOCK_BITS;
|
|
@@ -4433,17 +4434,19 @@ static unsigned long __init usemap_size(unsigned long zonesize)
|
|
|
}
|
|
|
|
|
|
static void __init setup_usemap(struct pglist_data *pgdat,
|
|
|
- struct zone *zone, unsigned long zonesize)
|
|
|
+ struct zone *zone,
|
|
|
+ unsigned long zone_start_pfn,
|
|
|
+ unsigned long zonesize)
|
|
|
{
|
|
|
- unsigned long usemapsize = usemap_size(zonesize);
|
|
|
+ unsigned long usemapsize = usemap_size(zone_start_pfn, zonesize);
|
|
|
zone->pageblock_flags = NULL;
|
|
|
if (usemapsize)
|
|
|
zone->pageblock_flags = alloc_bootmem_node_nopanic(pgdat,
|
|
|
usemapsize);
|
|
|
}
|
|
|
#else
|
|
|
-static inline void setup_usemap(struct pglist_data *pgdat,
|
|
|
- struct zone *zone, unsigned long zonesize) {}
|
|
|
+static inline void setup_usemap(struct pglist_data *pgdat, struct zone *zone,
|
|
|
+ unsigned long zone_start_pfn, unsigned long zonesize) {}
|
|
|
#endif /* CONFIG_SPARSEMEM */
|
|
|
|
|
|
#ifdef CONFIG_HUGETLB_PAGE_SIZE_VARIABLE
|
|
@@ -4594,7 +4597,7 @@ static void __paginginit free_area_init_core(struct pglist_data *pgdat,
|
|
|
continue;
|
|
|
|
|
|
set_pageblock_order();
|
|
|
- setup_usemap(pgdat, zone, size);
|
|
|
+ setup_usemap(pgdat, zone, zone_start_pfn, size);
|
|
|
ret = init_currently_empty_zone(zone, zone_start_pfn,
|
|
|
size, MEMMAP_EARLY);
|
|
|
BUG_ON(ret);
|