|
@@ -1024,24 +1024,33 @@ void __meminit reserve_bootmem_region(unsigned long start, unsigned long end)
|
|
|
|
|
|
static bool free_pages_prepare(struct page *page, unsigned int order)
|
|
|
{
|
|
|
- bool compound = PageCompound(page);
|
|
|
- int i, bad = 0;
|
|
|
+ int bad = 0;
|
|
|
|
|
|
VM_BUG_ON_PAGE(PageTail(page), page);
|
|
|
- VM_BUG_ON_PAGE(compound && compound_order(page) != order, page);
|
|
|
|
|
|
trace_mm_page_free(page, order);
|
|
|
kmemcheck_free_shadow(page, order);
|
|
|
kasan_free_pages(page, order);
|
|
|
|
|
|
+ /*
|
|
|
+ * Check tail pages before head page information is cleared to
|
|
|
+ * avoid checking PageCompound for order-0 pages.
|
|
|
+ */
|
|
|
+ if (unlikely(order)) {
|
|
|
+ bool compound = PageCompound(page);
|
|
|
+ int i;
|
|
|
+
|
|
|
+ VM_BUG_ON_PAGE(compound && compound_order(page) != order, page);
|
|
|
+
|
|
|
+ for (i = 1; i < (1 << order); i++) {
|
|
|
+ if (compound)
|
|
|
+ bad += free_tail_pages_check(page, page + i);
|
|
|
+ bad += free_pages_check(page + i);
|
|
|
+ }
|
|
|
+ }
|
|
|
if (PageAnon(page))
|
|
|
page->mapping = NULL;
|
|
|
bad += free_pages_check(page);
|
|
|
- for (i = 1; i < (1 << order); i++) {
|
|
|
- if (compound)
|
|
|
- bad += free_tail_pages_check(page, page + i);
|
|
|
- bad += free_pages_check(page + i);
|
|
|
- }
|
|
|
if (bad)
|
|
|
return false;
|
|
|
|