diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 0745aedebb37142ff44bfc24ec79d8f4543c4d7b..3bb3484563eda591d7e1fba46b2e3263d870a11c 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); }