summaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
authorChristoph Lameter <clameter@sgi.com>2007-05-06 14:49:40 -0700
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-05-07 12:12:53 -0700
commit6d7779538f765963ced45a3fa4bed7ba8d2c277d (patch)
tree07d47e6ff1ab30309004e2ba0674dcabd83945c1 /mm
parentd85f33855c303acfa87fa457157cef755b6087df (diff)
downloadlinux-6d7779538f765963ced45a3fa4bed7ba8d2c277d.tar.bz2
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.c10
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);
}
}