diff options
Diffstat (limited to 'mm/bootmem.c')
-rw-r--r-- | mm/bootmem.c | 39 |
1 files changed, 16 insertions, 23 deletions
diff --git a/mm/bootmem.c b/mm/bootmem.c index 2b0bcb019ec2..6ab7744e692e 100644 --- a/mm/bootmem.c +++ b/mm/bootmem.c | |||
@@ -241,33 +241,26 @@ static unsigned long __init free_all_bootmem_core(bootmem_data_t *bdata) | |||
241 | return count; | 241 | return count; |
242 | } | 242 | } |
243 | 243 | ||
244 | static void reset_node_lowmem_managed_pages(pg_data_t *pgdat) | 244 | static int reset_managed_pages_done __initdata; |
245 | |||
246 | static inline void __init reset_node_managed_pages(pg_data_t *pgdat) | ||
245 | { | 247 | { |
246 | struct zone *z; | 248 | struct zone *z; |
247 | 249 | ||
248 | /* | 250 | if (reset_managed_pages_done) |
249 | * In free_area_init_core(), highmem zone's managed_pages is set to | 251 | return; |
250 | * present_pages, and bootmem allocator doesn't allocate from highmem | 252 | |
251 | * zones. So there's no need to recalculate managed_pages because all | ||
252 | * highmem pages will be managed by the buddy system. Here highmem | ||
253 | * zone also includes highmem movable zone. | ||
254 | */ | ||
255 | for (z = pgdat->node_zones; z < pgdat->node_zones + MAX_NR_ZONES; z++) | 253 | for (z = pgdat->node_zones; z < pgdat->node_zones + MAX_NR_ZONES; z++) |
256 | if (!is_highmem(z)) | 254 | z->managed_pages = 0; |
257 | z->managed_pages = 0; | ||
258 | } | 255 | } |
259 | 256 | ||
260 | /** | 257 | void __init reset_all_zones_managed_pages(void) |
261 | * free_all_bootmem_node - release a node's free pages to the buddy allocator | ||
262 | * @pgdat: node to be released | ||
263 | * | ||
264 | * Returns the number of pages actually released. | ||
265 | */ | ||
266 | unsigned long __init free_all_bootmem_node(pg_data_t *pgdat) | ||
267 | { | 258 | { |
268 | register_page_bootmem_info_node(pgdat); | 259 | struct pglist_data *pgdat; |
269 | reset_node_lowmem_managed_pages(pgdat); | 260 | |
270 | return free_all_bootmem_core(pgdat->bdata); | 261 | for_each_online_pgdat(pgdat) |
262 | reset_node_managed_pages(pgdat); | ||
263 | reset_managed_pages_done = 1; | ||
271 | } | 264 | } |
272 | 265 | ||
273 | /** | 266 | /** |
@@ -279,14 +272,14 @@ unsigned long __init free_all_bootmem(void) | |||
279 | { | 272 | { |
280 | unsigned long total_pages = 0; | 273 | unsigned long total_pages = 0; |
281 | bootmem_data_t *bdata; | 274 | bootmem_data_t *bdata; |
282 | struct pglist_data *pgdat; | ||
283 | 275 | ||
284 | for_each_online_pgdat(pgdat) | 276 | reset_all_zones_managed_pages(); |
285 | reset_node_lowmem_managed_pages(pgdat); | ||
286 | 277 | ||
287 | list_for_each_entry(bdata, &bdata_list, list) | 278 | list_for_each_entry(bdata, &bdata_list, list) |
288 | total_pages += free_all_bootmem_core(bdata); | 279 | total_pages += free_all_bootmem_core(bdata); |
289 | 280 | ||
281 | totalram_pages += total_pages; | ||
282 | |||
290 | return total_pages; | 283 | return total_pages; |
291 | } | 284 | } |
292 | 285 | ||