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>
This commit is contained in:
Christoph Lameter
2007-05-06 14:49:40 -07:00
committed by Linus Torvalds
parent d85f33855c
commit 6d7779538f
3 changed files with 32 additions and 26 deletions

View File

@@ -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);
}
}