diff options
Diffstat (limited to 'mm/bootmem.c')
-rw-r--r-- | mm/bootmem.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/mm/bootmem.c b/mm/bootmem.c index 260e703850d8..f82f7aebbee3 100644 --- a/mm/bootmem.c +++ b/mm/bootmem.c | |||
@@ -256,6 +256,7 @@ found: | |||
256 | static unsigned long __init free_all_bootmem_core(pg_data_t *pgdat) | 256 | static unsigned long __init free_all_bootmem_core(pg_data_t *pgdat) |
257 | { | 257 | { |
258 | struct page *page; | 258 | struct page *page; |
259 | unsigned long pfn; | ||
259 | bootmem_data_t *bdata = pgdat->bdata; | 260 | bootmem_data_t *bdata = pgdat->bdata; |
260 | unsigned long i, count, total = 0; | 261 | unsigned long i, count, total = 0; |
261 | unsigned long idx; | 262 | unsigned long idx; |
@@ -266,7 +267,7 @@ static unsigned long __init free_all_bootmem_core(pg_data_t *pgdat) | |||
266 | 267 | ||
267 | count = 0; | 268 | count = 0; |
268 | /* first extant page of the node */ | 269 | /* first extant page of the node */ |
269 | page = virt_to_page(phys_to_virt(bdata->node_boot_start)); | 270 | pfn = bdata->node_boot_start >> PAGE_SHIFT; |
270 | idx = bdata->node_low_pfn - (bdata->node_boot_start >> PAGE_SHIFT); | 271 | idx = bdata->node_low_pfn - (bdata->node_boot_start >> PAGE_SHIFT); |
271 | map = bdata->node_bootmem_map; | 272 | map = bdata->node_bootmem_map; |
272 | /* Check physaddr is O(LOG2(BITS_PER_LONG)) page aligned */ | 273 | /* Check physaddr is O(LOG2(BITS_PER_LONG)) page aligned */ |
@@ -275,9 +276,11 @@ static unsigned long __init free_all_bootmem_core(pg_data_t *pgdat) | |||
275 | gofast = 1; | 276 | gofast = 1; |
276 | for (i = 0; i < idx; ) { | 277 | for (i = 0; i < idx; ) { |
277 | unsigned long v = ~map[i / BITS_PER_LONG]; | 278 | unsigned long v = ~map[i / BITS_PER_LONG]; |
279 | |||
278 | if (gofast && v == ~0UL) { | 280 | if (gofast && v == ~0UL) { |
279 | int j, order; | 281 | int j, order; |
280 | 282 | ||
283 | page = pfn_to_page(pfn); | ||
281 | count += BITS_PER_LONG; | 284 | count += BITS_PER_LONG; |
282 | __ClearPageReserved(page); | 285 | __ClearPageReserved(page); |
283 | order = ffs(BITS_PER_LONG) - 1; | 286 | order = ffs(BITS_PER_LONG) - 1; |
@@ -292,6 +295,8 @@ static unsigned long __init free_all_bootmem_core(pg_data_t *pgdat) | |||
292 | page += BITS_PER_LONG; | 295 | page += BITS_PER_LONG; |
293 | } else if (v) { | 296 | } else if (v) { |
294 | unsigned long m; | 297 | unsigned long m; |
298 | |||
299 | page = pfn_to_page(pfn); | ||
295 | for (m = 1; m && i < idx; m<<=1, page++, i++) { | 300 | for (m = 1; m && i < idx; m<<=1, page++, i++) { |
296 | if (v & m) { | 301 | if (v & m) { |
297 | count++; | 302 | count++; |
@@ -302,8 +307,8 @@ static unsigned long __init free_all_bootmem_core(pg_data_t *pgdat) | |||
302 | } | 307 | } |
303 | } else { | 308 | } else { |
304 | i+=BITS_PER_LONG; | 309 | i+=BITS_PER_LONG; |
305 | page += BITS_PER_LONG; | ||
306 | } | 310 | } |
311 | pfn += BITS_PER_LONG; | ||
307 | } | 312 | } |
308 | total += count; | 313 | total += count; |
309 | 314 | ||