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

@ -269,14 +269,7 @@ static inline int get_page_unless_zero(struct page *page)
static inline struct page *compound_head(struct page *page)
{
/*
* We could avoid the PageCompound(page) check if
* we would not overload PageTail().
*
* This check has to be done in several performance critical
* paths of the slab etc. IMHO PageTail deserves its own flag.
*/
if (unlikely(PageCompound(page) && PageTail(page)))
if (unlikely(PageTail(page)))
return page->first_page;
return page;
}
@ -327,7 +320,7 @@ static inline compound_page_dtor *get_compound_page_dtor(struct page *page)
static inline int compound_order(struct page *page)
{
if (!PageCompound(page) || PageTail(page))
if (!PageHead(page))
return 0;
return (unsigned long)page[1].lru.prev;
}