diff options
Diffstat (limited to 'mm/page_alloc.c')
| -rw-r--r-- | mm/page_alloc.c | 5 | 
1 files changed, 4 insertions, 1 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 0745aedebb37..3bb3484563ed 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -5631,9 +5631,12 @@ EXPORT_SYMBOL(get_zeroed_page);   */  void __free_pages(struct page *page, unsigned int order)  { +	/* get PageHead before we drop reference */ +	int head = PageHead(page); +  	if (put_page_testzero(page))  		free_the_page(page, order); -	else if (!PageHead(page)) +	else if (!head)  		while (order-- > 0)  			free_the_page(page + (1 << order), order);  }  |