diff options
author | Christoph Lameter <clameter@sgi.com> | 2007-05-06 14:49:40 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-05-07 12:12:53 -0700 |
commit | 6d7779538f765963ced45a3fa4bed7ba8d2c277d (patch) | |
tree | 07d47e6ff1ab30309004e2ba0674dcabd83945c1 /mm | |
parent | d85f33855c303acfa87fa457157cef755b6087df (diff) |
mm: optimize compound_head() by avoiding a shared page flag
The patch adds PageTail(page) and PageHead(page) to check if a page is the
head or the tail of a compound page. This is done by masking the two bits
describing the state of a compound page and then comparing them. So one
comparision and a branch instead of two bit checks and two branches.
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm')
-rw-r--r-- | mm/page_alloc.c | 10 |
1 files changed, 4 insertions, 6 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index fc241fe295ab..36d713e216e8 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -235,12 +235,11 @@ static void prep_compound_page(struct page *page, unsigned long order) set_compound_page_dtor(page, free_compound_page); set_compound_order(page, order); - __SetPageCompound(page); + __SetPageHead(page); for (i = 1; i < nr_pages; i++) { struct page *p = page + i; __SetPageTail(p); - __SetPageCompound(p); p->first_page = page; } } @@ -253,17 +252,16 @@ static void destroy_compound_page(struct page *page, unsigned long order) if (unlikely(compound_order(page) != order)) bad_page(page); - if (unlikely(!PageCompound(page))) + if (unlikely(!PageHead(page))) bad_page(page); - __ClearPageCompound(page); + __ClearPageHead(page); for (i = 1; i < nr_pages; i++) { struct page *p = page + i; - if (unlikely(!PageCompound(p) | !PageTail(p) | + if (unlikely(!PageTail(p) | (p->first_page != page))) bad_page(page); __ClearPageTail(p); - __ClearPageCompound(p); } } |