diff options
Diffstat (limited to 'mm/page_alloc.c')
-rw-r--r-- | mm/page_alloc.c | 15 |
1 files changed, 6 insertions, 9 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index dde04ff4be31..eec89ab39bb6 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -169,20 +169,17 @@ static void bad_page(struct page *page) | |||
169 | * All pages have PG_compound set. All pages have their ->private pointing at | 169 | * All pages have PG_compound set. All pages have their ->private pointing at |
170 | * the head page (even the head page has this). | 170 | * the head page (even the head page has this). |
171 | * | 171 | * |
172 | * The first tail page's ->mapping, if non-zero, holds the address of the | 172 | * The first tail page's ->lru.next holds the address of the compound page's |
173 | * compound page's put_page() function. | 173 | * put_page() function. Its ->lru.prev holds the order of allocation. |
174 | * | 174 | * 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 | */ | 175 | */ |
179 | static void prep_compound_page(struct page *page, unsigned long order) | 176 | static void prep_compound_page(struct page *page, unsigned long order) |
180 | { | 177 | { |
181 | int i; | 178 | int i; |
182 | int nr_pages = 1 << order; | 179 | int nr_pages = 1 << order; |
183 | 180 | ||
184 | page[1].mapping = NULL; | 181 | page[1].lru.next = NULL; /* set dtor */ |
185 | page[1].index = order; | 182 | page[1].lru.prev = (void *)order; |
186 | for (i = 0; i < nr_pages; i++) { | 183 | for (i = 0; i < nr_pages; i++) { |
187 | struct page *p = page + i; | 184 | struct page *p = page + i; |
188 | 185 | ||
@@ -196,7 +193,7 @@ static void destroy_compound_page(struct page *page, unsigned long order) | |||
196 | int i; | 193 | int i; |
197 | int nr_pages = 1 << order; | 194 | int nr_pages = 1 << order; |
198 | 195 | ||
199 | if (unlikely(page[1].index != order)) | 196 | if (unlikely((unsigned long)page[1].lru.prev != order)) |
200 | bad_page(page); | 197 | bad_page(page); |
201 | 198 | ||
202 | for (i = 0; i < nr_pages; i++) { | 199 | for (i = 0; i < nr_pages; i++) { |