summaryrefslogtreecommitdiffstats
path: root/mm/page_alloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/page_alloc.c')
-rw-r--r--mm/page_alloc.c15
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 */
4423static unsigned long __init usemap_size(unsigned long zonesize) 4423static 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
4435static void __init setup_usemap(struct pglist_data *pgdat, 4436static 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
4445static inline void setup_usemap(struct pglist_data *pgdat, 4448static 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);