diff options
Diffstat (limited to 'mm/page_alloc.c')
-rw-r--r-- | mm/page_alloc.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 9673d96b1ba7..6a83cd35cfde 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -4420,10 +4420,11 @@ static void __meminit calculate_node_totalpages(struct pglist_data *pgdat, | |||
4420 | * round what is now in bits to nearest long in bits, then return it in | 4420 | * round what is now in bits to nearest long in bits, then return it in |
4421 | * bytes. | 4421 | * bytes. |
4422 | */ | 4422 | */ |
4423 | static unsigned long __init usemap_size(unsigned long zonesize) | 4423 | static unsigned long __init usemap_size(unsigned long zone_start_pfn, unsigned long zonesize) |
4424 | { | 4424 | { |
4425 | unsigned long usemapsize; | 4425 | unsigned long usemapsize; |
4426 | 4426 | ||
4427 | zonesize += zone_start_pfn & (pageblock_nr_pages-1); | ||
4427 | usemapsize = roundup(zonesize, pageblock_nr_pages); | 4428 | usemapsize = roundup(zonesize, pageblock_nr_pages); |
4428 | usemapsize = usemapsize >> pageblock_order; | 4429 | usemapsize = usemapsize >> pageblock_order; |
4429 | usemapsize *= NR_PAGEBLOCK_BITS; | 4430 | usemapsize *= NR_PAGEBLOCK_BITS; |
@@ -4433,17 +4434,19 @@ static unsigned long __init usemap_size(unsigned long zonesize) | |||
4433 | } | 4434 | } |
4434 | 4435 | ||
4435 | static void __init setup_usemap(struct pglist_data *pgdat, | 4436 | static void __init setup_usemap(struct pglist_data *pgdat, |
4436 | struct zone *zone, unsigned long zonesize) | 4437 | struct zone *zone, |
4438 | unsigned long zone_start_pfn, | ||
4439 | unsigned long zonesize) | ||
4437 | { | 4440 | { |
4438 | unsigned long usemapsize = usemap_size(zonesize); | 4441 | unsigned long usemapsize = usemap_size(zone_start_pfn, zonesize); |
4439 | zone->pageblock_flags = NULL; | 4442 | zone->pageblock_flags = NULL; |
4440 | if (usemapsize) | 4443 | if (usemapsize) |
4441 | zone->pageblock_flags = alloc_bootmem_node_nopanic(pgdat, | 4444 | zone->pageblock_flags = alloc_bootmem_node_nopanic(pgdat, |
4442 | usemapsize); | 4445 | usemapsize); |
4443 | } | 4446 | } |
4444 | #else | 4447 | #else |
4445 | static inline void setup_usemap(struct pglist_data *pgdat, | 4448 | static inline void setup_usemap(struct pglist_data *pgdat, struct zone *zone, |
4446 | struct zone *zone, unsigned long zonesize) {} | 4449 | unsigned long zone_start_pfn, unsigned long zonesize) {} |
4447 | #endif /* CONFIG_SPARSEMEM */ | 4450 | #endif /* CONFIG_SPARSEMEM */ |
4448 | 4451 | ||
4449 | #ifdef CONFIG_HUGETLB_PAGE_SIZE_VARIABLE | 4452 | #ifdef CONFIG_HUGETLB_PAGE_SIZE_VARIABLE |
@@ -4594,7 +4597,7 @@ static void __paginginit free_area_init_core(struct pglist_data *pgdat, | |||
4594 | continue; | 4597 | continue; |
4595 | 4598 | ||
4596 | set_pageblock_order(); | 4599 | set_pageblock_order(); |
4597 | setup_usemap(pgdat, zone, size); | 4600 | setup_usemap(pgdat, zone, zone_start_pfn, size); |
4598 | ret = init_currently_empty_zone(zone, zone_start_pfn, | 4601 | ret = init_currently_empty_zone(zone, zone_start_pfn, |
4599 | size, MEMMAP_EARLY); | 4602 | size, MEMMAP_EARLY); |
4600 | BUG_ON(ret); | 4603 | BUG_ON(ret); |