diff options
author | David Howells <dhowells@redhat.com> | 2006-01-06 03:11:08 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-01-06 11:33:26 -0500 |
commit | a226f6c899799fe2c4919daa0767ac579c88f7bd (patch) | |
tree | 82863c401f344cae8ab518b174085a7071a0a325 /mm/bootmem.c | |
parent | 008857c1a49ccffc31a54c3ea7e182833bd61304 (diff) |
[PATCH] FRV: Clean up bootmem allocator's page freeing algorithm
The attached patch cleans up the way the bootmem allocator frees pages.
A new function, __free_pages_bootmem(), is provided in mm/page_alloc.c that is
called from mm/bootmem.c to turn pages over to the main allocator. All the
bits of code to initialise pages (clearing PG_reserved and setting the page
count) are moved to here. The checks on page validity are removed, on the
assumption that the struct page arrays will have been prepared correctly.
Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'mm/bootmem.c')
-rw-r--r-- | mm/bootmem.c | 20 |
1 files changed, 4 insertions, 16 deletions
diff --git a/mm/bootmem.c b/mm/bootmem.c index cbb82ee14fb5..35c32290f717 100644 --- a/mm/bootmem.c +++ b/mm/bootmem.c | |||
@@ -296,20 +296,12 @@ static unsigned long __init free_all_bootmem_core(pg_data_t *pgdat) | |||
296 | unsigned long v = ~map[i / BITS_PER_LONG]; | 296 | unsigned long v = ~map[i / BITS_PER_LONG]; |
297 | 297 | ||
298 | if (gofast && v == ~0UL) { | 298 | if (gofast && v == ~0UL) { |
299 | int j, order; | 299 | int order; |
300 | 300 | ||
301 | page = pfn_to_page(pfn); | 301 | page = pfn_to_page(pfn); |
302 | count += BITS_PER_LONG; | 302 | count += BITS_PER_LONG; |
303 | __ClearPageReserved(page); | ||
304 | order = ffs(BITS_PER_LONG) - 1; | 303 | order = ffs(BITS_PER_LONG) - 1; |
305 | set_page_refs(page, order); | 304 | __free_pages_bootmem(page, order); |
306 | for (j = 1; j < BITS_PER_LONG; j++) { | ||
307 | if (j + 16 < BITS_PER_LONG) | ||
308 | prefetchw(page + j + 16); | ||
309 | __ClearPageReserved(page + j); | ||
310 | set_page_count(page + j, 0); | ||
311 | } | ||
312 | __free_pages(page, order); | ||
313 | i += BITS_PER_LONG; | 305 | i += BITS_PER_LONG; |
314 | page += BITS_PER_LONG; | 306 | page += BITS_PER_LONG; |
315 | } else if (v) { | 307 | } else if (v) { |
@@ -319,9 +311,7 @@ static unsigned long __init free_all_bootmem_core(pg_data_t *pgdat) | |||
319 | for (m = 1; m && i < idx; m<<=1, page++, i++) { | 311 | for (m = 1; m && i < idx; m<<=1, page++, i++) { |
320 | if (v & m) { | 312 | if (v & m) { |
321 | count++; | 313 | count++; |
322 | __ClearPageReserved(page); | 314 | __free_pages_bootmem(page, 0); |
323 | set_page_refs(page, 0); | ||
324 | __free_page(page); | ||
325 | } | 315 | } |
326 | } | 316 | } |
327 | } else { | 317 | } else { |
@@ -339,9 +329,7 @@ static unsigned long __init free_all_bootmem_core(pg_data_t *pgdat) | |||
339 | count = 0; | 329 | count = 0; |
340 | for (i = 0; i < ((bdata->node_low_pfn-(bdata->node_boot_start >> PAGE_SHIFT))/8 + PAGE_SIZE-1)/PAGE_SIZE; i++,page++) { | 330 | for (i = 0; i < ((bdata->node_low_pfn-(bdata->node_boot_start >> PAGE_SHIFT))/8 + PAGE_SIZE-1)/PAGE_SIZE; i++,page++) { |
341 | count++; | 331 | count++; |
342 | __ClearPageReserved(page); | 332 | __free_pages_bootmem(page, 0); |
343 | set_page_count(page, 1); | ||
344 | __free_page(page); | ||
345 | } | 333 | } |
346 | total += count; | 334 | total += count; |
347 | bdata->node_bootmem_map = NULL; | 335 | bdata->node_bootmem_map = NULL; |