diff options
author | Steve French <sfrench@us.ibm.com> | 2006-02-15 03:36:31 +0000 |
---|---|---|
committer | Steve French <sfrench@us.ibm.com> | 2006-02-15 03:36:31 +0000 |
commit | 0ed3f64ec3a7ad29e83e03607115eeffa32f553c (patch) | |
tree | 528681b043e947cfc51527d56098f586b6dfa217 /mm/page_alloc.c | |
parent | 5815449d1bfcb22f74b0e36a8b0631d6584cb7fc (diff) | |
parent | 10ee39fe3ff618d274e1cd0f6abbc2917b736bfd (diff) | |
download | kernel-crypto-0ed3f64ec3a7ad29e83e03607115eeffa32f553c.tar.gz kernel-crypto-0ed3f64ec3a7ad29e83e03607115eeffa32f553c.tar.xz kernel-crypto-0ed3f64ec3a7ad29e83e03607115eeffa32f553c.zip |
Merge with /pub/scm/linux/kernel/git/torvalds/linux-2.6.git
Signed-off-by: Steve French <sfrench@us.ibm.com>
Diffstat (limited to 'mm/page_alloc.c')
-rw-r--r-- | mm/page_alloc.c | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index dde04ff4be3..62c12252858 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -56,6 +56,7 @@ long nr_swap_pages; int percpu_pagelist_fraction; static void fastcall free_hot_cold_page(struct page *page, int cold); +static void __free_pages_ok(struct page *page, unsigned int order); /* * results with 256, 32 in the lowmem_reserve sysctl: @@ -169,20 +170,23 @@ static void bad_page(struct page *page) * All pages have PG_compound set. All pages have their ->private pointing at * the head page (even the head page has this). * - * The first tail page's ->mapping, if non-zero, holds the address of the - * compound page's put_page() function. - * - * The order of the allocation is stored in the first tail page's ->index - * This is only for debug at present. This usage means that zero-order pages - * may not be compound. + * The first tail page's ->lru.next holds the address of the compound page's + * put_page() function. Its ->lru.prev holds the order of allocation. + * This usage means that zero-order pages may not be compound. */ + +static void free_compound_page(struct page *page) +{ + __free_pages_ok(page, (unsigned long)page[1].lru.prev); +} + static void prep_compound_page(struct page *page, unsigned long order) { int i; int nr_pages = 1 << order; - page[1].mapping = NULL; - page[1].index = order; + page[1].lru.next = (void *)free_compound_page; /* set dtor */ + page[1].lru.prev = (void *)order; for (i = 0; i < nr_pages; i++) { struct page *p = page + i; @@ -196,7 +200,7 @@ static void destroy_compound_page(struct page *page, unsigned long order) int i; int nr_pages = 1 << order; - if (unlikely(page[1].index != order)) + if (unlikely((unsigned long)page[1].lru.prev != order)) bad_page(page); for (i = 0; i < nr_pages; i++) { |