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>
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index fc241fe..36d713e 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -235,12 +235,11 @@
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 @@
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);
}
}