diff options
Diffstat (limited to 'mm/page_alloc.c')
| -rw-r--r-- | mm/page_alloc.c | 19 | 
1 files changed, 13 insertions, 6 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index df2022ff0c8..6a83cd35cfd 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -773,6 +773,10 @@ void __init init_cma_reserved_pageblock(struct page *page)  	set_pageblock_migratetype(page, MIGRATE_CMA);  	__free_pages(page, pageblock_order);  	totalram_pages += pageblock_nr_pages; +#ifdef CONFIG_HIGHMEM +	if (PageHighMem(page)) +		totalhigh_pages += pageblock_nr_pages; +#endif  }  #endif @@ -4416,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; @@ -4429,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 @@ -4590,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);  |