diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 5e26a90ac795f02cd2f9b45d27fe100abeae0b52..c8e874e0d986b639fcb8b857caf0a9867e10bf71 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -4682,8 +4682,14 @@ void page_frag_free(void *addr) { struct page *page = virt_to_head_page(addr); - if (unlikely(put_page_testzero(page))) - __free_pages_ok(page, compound_order(page)); + if (unlikely(put_page_testzero(page))) { + unsigned int order = compound_order(page); + + if (order == 0) /* Via pcp? */ + free_unref_page(page); + else + __free_pages_ok(page, order); + } } EXPORT_SYMBOL(page_frag_free);