diff options
Diffstat (limited to 'mm/page_alloc.c')
| -rw-r--r-- | mm/page_alloc.c | 13 | 
1 files changed, 8 insertions, 5 deletions
| diff --git a/mm/page_alloc.c b/mm/page_alloc.c index e293c58bea58..27b8681139fd 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -268,13 +268,14 @@ void prep_compound_page(struct page *page, unsigned long order)  {  	int i;  	int nr_pages = 1 << order; +	struct page *p = page + 1;  	set_compound_page_dtor(page, free_compound_page);  	set_compound_order(page, order);  	__SetPageHead(page); -	for (i = 1; i < nr_pages; i++) { -		struct page *p = page + i; - +	for (i = 1; i < nr_pages; i++, p++) { +		if (unlikely((i & (MAX_ORDER_NR_PAGES - 1)) == 0)) +			p = pfn_to_page(page_to_pfn(page) + i);  		__SetPageTail(p);  		p->first_page = page;  	} @@ -284,6 +285,7 @@ static void destroy_compound_page(struct page *page, unsigned long order)  {  	int i;  	int nr_pages = 1 << order; +	struct page *p = page + 1;  	if (unlikely(compound_order(page) != order))  		bad_page(page); @@ -291,8 +293,9 @@ static void destroy_compound_page(struct page *page, unsigned long order)  	if (unlikely(!PageHead(page)))  			bad_page(page);  	__ClearPageHead(page); -	for (i = 1; i < nr_pages; i++) { -		struct page *p = page + i; +	for (i = 1; i < nr_pages; i++, p++) { +		if (unlikely((i & (MAX_ORDER_NR_PAGES - 1)) == 0)) +			p = pfn_to_page(page_to_pfn(page) + i);  		if (unlikely(!PageTail(p) |  				(p->first_page != page))) | 
