aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNick Piggin <nickpiggin@yahoo.com.au>2009-06-16 18:32:10 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2009-06-16 22:47:34 -0400
commita3af9c389a7f3e675313f442fdd8c247c1cdb66b (patch)
tree1ff17dc384d3bcfe82d27e3d05a35ff3b859652c
parentd395b73428d9748fb70b33477c9b2acae62f360a (diff)
page allocator: do not check for compound pages during the page allocator sanity checks
A number of sanity checks are made on each page allocation and free including that the page count is zero. page_count() checks for compound pages and checks the count of the head page if true. However, in these paths, we do not care if the page is compound or not as the count of each tail page should also be zero. This patch makes two changes to the use of page_count() in the free path. It converts one check of page_count() to a VM_BUG_ON() as the count should have been unconditionally checked earlier in the free path. It also avoids checking for compound pages. [mel@csn.ul.ie: Wrote changelog] Signed-off-by: Mel Gorman <mel@csn.ul.ie> Signed-off-by: Nick Piggin <nickpiggin@yahoo.com.au> Reviewed-by: Christoph Lameter <cl@linux-foundation.org> Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> Cc: Pekka Enberg <penberg@cs.helsinki.fi> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Dave Hansen <dave@linux.vnet.ibm.com> Cc: Lee Schermerhorn <Lee.Schermerhorn@hp.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--mm/page_alloc.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index fd8e3ca0cf3..8485735fc69 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -421,7 +421,7 @@ static inline int page_is_buddy(struct page *page, struct page *buddy,
421 return 0; 421 return 0;
422 422
423 if (PageBuddy(buddy) && page_order(buddy) == order) { 423 if (PageBuddy(buddy) && page_order(buddy) == order) {
424 BUG_ON(page_count(buddy) != 0); 424 VM_BUG_ON(page_count(buddy) != 0);
425 return 1; 425 return 1;
426 } 426 }
427 return 0; 427 return 0;
@@ -497,7 +497,7 @@ static inline int free_pages_check(struct page *page)
497{ 497{
498 if (unlikely(page_mapcount(page) | 498 if (unlikely(page_mapcount(page) |
499 (page->mapping != NULL) | 499 (page->mapping != NULL) |
500 (page_count(page) != 0) | 500 (atomic_read(&page->_count) != 0) |
501 (page->flags & PAGE_FLAGS_CHECK_AT_FREE))) { 501 (page->flags & PAGE_FLAGS_CHECK_AT_FREE))) {
502 bad_page(page); 502 bad_page(page);
503 return 1; 503 return 1;
@@ -642,7 +642,7 @@ static int prep_new_page(struct page *page, int order, gfp_t gfp_flags)
642{ 642{
643 if (unlikely(page_mapcount(page) | 643 if (unlikely(page_mapcount(page) |
644 (page->mapping != NULL) | 644 (page->mapping != NULL) |
645 (page_count(page) != 0) | 645 (atomic_read(&page->_count) != 0) |
646 (page->flags & PAGE_FLAGS_CHECK_AT_PREP))) { 646 (page->flags & PAGE_FLAGS_CHECK_AT_PREP))) {
647 bad_page(page); 647 bad_page(page);
648 return 1; 648 return 1;