diff options
| author | Steve French <sfrench@us.ibm.com> | 2006-02-14 22:36:31 -0500 |
|---|---|---|
| committer | Steve French <sfrench@us.ibm.com> | 2006-02-14 22:36:31 -0500 |
| commit | 0ed3f64ec3a7ad29e83e03607115eeffa32f553c (patch) | |
| tree | 528681b043e947cfc51527d56098f586b6dfa217 /mm/page_alloc.c | |
| parent | 5815449d1bfcb22f74b0e36a8b0631d6584cb7fc (diff) | |
| parent | 10ee39fe3ff618d274e1cd0f6abbc2917b736bfd (diff) | |
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 dde04ff4be31..62c122528587 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
| @@ -56,6 +56,7 @@ long nr_swap_pages; | |||
| 56 | int percpu_pagelist_fraction; | 56 | int percpu_pagelist_fraction; |
| 57 | 57 | ||
| 58 | static void fastcall free_hot_cold_page(struct page *page, int cold); | 58 | static void fastcall free_hot_cold_page(struct page *page, int cold); |
| 59 | static void __free_pages_ok(struct page *page, unsigned int order); | ||
| 59 | 60 | ||
| 60 | /* | 61 | /* |
| 61 | * results with 256, 32 in the lowmem_reserve sysctl: | 62 | * results with 256, 32 in the lowmem_reserve sysctl: |
| @@ -169,20 +170,23 @@ static void bad_page(struct page *page) | |||
| 169 | * All pages have PG_compound set. All pages have their ->private pointing at | 170 | * All pages have PG_compound set. All pages have their ->private pointing at |
| 170 | * the head page (even the head page has this). | 171 | * the head page (even the head page has this). |
| 171 | * | 172 | * |
| 172 | * The first tail page's ->mapping, if non-zero, holds the address of the | 173 | * The first tail page's ->lru.next holds the address of the compound page's |
| 173 | * compound page's put_page() function. | 174 | * put_page() function. Its ->lru.prev holds the order of allocation. |
| 174 | * | 175 | * This usage means that zero-order pages may not be compound. |
| 175 | * The order of the allocation is stored in the first tail page's ->index | ||
| 176 | * This is only for debug at present. This usage means that zero-order pages | ||
| 177 | * may not be compound. | ||
| 178 | */ | 176 | */ |
| 177 | |||
| 178 | static void free_compound_page(struct page *page) | ||
| 179 | { | ||
| 180 | __free_pages_ok(page, (unsigned long)page[1].lru.prev); | ||
| 181 | } | ||
| 182 | |||
| 179 | static void prep_compound_page(struct page *page, unsigned long order) | 183 | static void prep_compound_page(struct page *page, unsigned long order) |
| 180 | { | 184 | { |
| 181 | int i; | 185 | int i; |
| 182 | int nr_pages = 1 << order; | 186 | int nr_pages = 1 << order; |
| 183 | 187 | ||
| 184 | page[1].mapping = NULL; | 188 | page[1].lru.next = (void *)free_compound_page; /* set dtor */ |
| 185 | page[1].index = order; | 189 | page[1].lru.prev = (void *)order; |
| 186 | for (i = 0; i < nr_pages; i++) { | 190 | for (i = 0; i < nr_pages; i++) { |
| 187 | struct page *p = page + i; | 191 | struct page *p = page + i; |
| 188 | 192 | ||
| @@ -196,7 +200,7 @@ static void destroy_compound_page(struct page *page, unsigned long order) | |||
| 196 | int i; | 200 | int i; |
| 197 | int nr_pages = 1 << order; | 201 | int nr_pages = 1 << order; |
| 198 | 202 | ||
| 199 | if (unlikely(page[1].index != order)) | 203 | if (unlikely((unsigned long)page[1].lru.prev != order)) |
| 200 | bad_page(page); | 204 | bad_page(page); |
| 201 | 205 | ||
| 202 | for (i = 0; i < nr_pages; i++) { | 206 | for (i = 0; i < nr_pages; i++) { |
