diff options
Diffstat (limited to 'mm/page_alloc.c')
| -rw-r--r-- | mm/page_alloc.c | 16 | 
1 files changed, 14 insertions, 2 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 20d17f8266fe..0ea758b898fd 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -816,9 +816,21 @@ void __init init_cma_reserved_pageblock(struct page *page)  		set_page_count(p, 0);  	} while (++p, --i); -	set_page_refcounted(page);  	set_pageblock_migratetype(page, MIGRATE_CMA); -	__free_pages(page, pageblock_order); + +	if (pageblock_order >= MAX_ORDER) { +		i = pageblock_nr_pages; +		p = page; +		do { +			set_page_refcounted(p); +			__free_pages(p, MAX_ORDER - 1); +			p += MAX_ORDER_NR_PAGES; +		} while (i -= MAX_ORDER_NR_PAGES); +	} else { +		set_page_refcounted(page); +		__free_pages(page, pageblock_order); +	} +  	adjust_managed_page_count(page, pageblock_nr_pages);  }  #endif  |