diff options
author | Yu Zhao <yuzhao@google.com> | 2014-12-10 18:43:17 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-12-10 20:41:06 -0500 |
commit | ab1f306fa92f4d875c8f0b9e9f90e27ca8e7b37b (patch) | |
tree | 7f0815cfd3294ae8d683a88745a4ee98c6171038 /mm/page_alloc.c | |
parent | d7be003a9d275299f5ee36bbdf156654f59e08e9 (diff) |
mm: verify compound order when freeing a page
This allows us to catch the bug fixed in the previous patch (mm: free
compound page with correct order).
Here we also verify whether a page is tail page or not -- tail pages are
supposed to be freed along with their head, not by themselves.
Signed-off-by: Yu Zhao <yuzhao@google.com>
Reviewed-by: "Kirill A. Shutemov" <kirill@shutemov.name>
Cc: Andrea Arcangeli <aarcange@redhat.com>
Cc: Mel Gorman <mel@csn.ul.ie>
Cc: David Rientjes <rientjes@google.com>
Cc: Bob Liu <lliubbo@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/page_alloc.c')
-rw-r--r-- | mm/page_alloc.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index f3a6bf12cbc1..b7c18f094697 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -741,6 +741,9 @@ static bool free_pages_prepare(struct page *page, unsigned int order) | |||
741 | int i; | 741 | int i; |
742 | int bad = 0; | 742 | int bad = 0; |
743 | 743 | ||
744 | VM_BUG_ON_PAGE(PageTail(page), page); | ||
745 | VM_BUG_ON_PAGE(PageHead(page) && compound_order(page) != order, page); | ||
746 | |||
744 | trace_mm_page_free(page, order); | 747 | trace_mm_page_free(page, order); |
745 | kmemcheck_free_shadow(page, order); | 748 | kmemcheck_free_shadow(page, order); |
746 | 749 | ||