@@ -241,20 +241,26 @@ static unsigned long __init free_all_bootmem_core(bootmem_data_t *bdata)
241241 return count ;
242242}
243243
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 )
245247{
246248 struct zone * z ;
247249
248- /*
249- * In free_area_init_core(), highmem zone's managed_pages is set to
250- * present_pages, and bootmem allocator doesn't allocate from highmem
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- */
250+ if (reset_managed_pages_done )
251+ return ;
252+
255253 for (z = pgdat -> node_zones ; z < pgdat -> node_zones + MAX_NR_ZONES ; z ++ )
256- if (!is_highmem (z ))
257- z -> managed_pages = 0 ;
254+ z -> managed_pages = 0 ;
255+ }
256+
257+ void __init reset_all_zones_managed_pages (void )
258+ {
259+ struct pglist_data * pgdat ;
260+
261+ for_each_online_pgdat (pgdat )
262+ reset_node_managed_pages (pgdat );
263+ reset_managed_pages_done = 1 ;
258264}
259265
260266/**
@@ -266,7 +272,7 @@ static void reset_node_lowmem_managed_pages(pg_data_t *pgdat)
266272unsigned long __init free_all_bootmem_node (pg_data_t * pgdat )
267273{
268274 register_page_bootmem_info_node (pgdat );
269- reset_node_lowmem_managed_pages (pgdat );
275+ reset_node_managed_pages (pgdat );
270276 return free_all_bootmem_core (pgdat -> bdata );
271277}
272278
@@ -279,10 +285,8 @@ unsigned long __init free_all_bootmem(void)
279285{
280286 unsigned long total_pages = 0 ;
281287 bootmem_data_t * bdata ;
282- struct pglist_data * pgdat ;
283288
284- for_each_online_pgdat (pgdat )
285- reset_node_lowmem_managed_pages (pgdat );
289+ reset_all_zones_managed_pages ();
286290
287291 list_for_each_entry (bdata , & bdata_list , list )
288292 total_pages += free_all_bootmem_core (bdata );
0 commit comments