diff options
Diffstat (limited to 'mm/nobootmem.c')
-rw-r--r-- | mm/nobootmem.c | 35 |
1 files changed, 21 insertions, 14 deletions
diff --git a/mm/nobootmem.c b/mm/nobootmem.c index bdd3fa2fc73b..61107cf55bb3 100644 --- a/mm/nobootmem.c +++ b/mm/nobootmem.c | |||
@@ -137,20 +137,25 @@ static unsigned long __init free_low_memory_core_early(void) | |||
137 | return count; | 137 | return count; |
138 | } | 138 | } |
139 | 139 | ||
140 | static void reset_node_lowmem_managed_pages(pg_data_t *pgdat) | 140 | static int reset_managed_pages_done __initdata; |
141 | |||
142 | static inline void __init reset_node_managed_pages(pg_data_t *pgdat) | ||
141 | { | 143 | { |
142 | struct zone *z; | 144 | struct zone *z; |
143 | 145 | ||
144 | /* | 146 | if (reset_managed_pages_done) |
145 | * In free_area_init_core(), highmem zone's managed_pages is set to | 147 | return; |
146 | * present_pages, and bootmem allocator doesn't allocate from highmem | ||
147 | * zones. So there's no need to recalculate managed_pages because all | ||
148 | * highmem pages will be managed by the buddy system. Here highmem | ||
149 | * zone also includes highmem movable zone. | ||
150 | */ | ||
151 | for (z = pgdat->node_zones; z < pgdat->node_zones + MAX_NR_ZONES; z++) | 148 | for (z = pgdat->node_zones; z < pgdat->node_zones + MAX_NR_ZONES; z++) |
152 | if (!is_highmem(z)) | 149 | z->managed_pages = 0; |
153 | z->managed_pages = 0; | 150 | } |
151 | |||
152 | void __init reset_all_zones_managed_pages(void) | ||
153 | { | ||
154 | struct pglist_data *pgdat; | ||
155 | |||
156 | for_each_online_pgdat(pgdat) | ||
157 | reset_node_managed_pages(pgdat); | ||
158 | reset_managed_pages_done = 1; | ||
154 | } | 159 | } |
155 | 160 | ||
156 | /** | 161 | /** |
@@ -160,17 +165,19 @@ static void reset_node_lowmem_managed_pages(pg_data_t *pgdat) | |||
160 | */ | 165 | */ |
161 | unsigned long __init free_all_bootmem(void) | 166 | unsigned long __init free_all_bootmem(void) |
162 | { | 167 | { |
163 | struct pglist_data *pgdat; | 168 | unsigned long pages; |
164 | 169 | ||
165 | for_each_online_pgdat(pgdat) | 170 | reset_all_zones_managed_pages(); |
166 | reset_node_lowmem_managed_pages(pgdat); | ||
167 | 171 | ||
168 | /* | 172 | /* |
169 | * We need to use MAX_NUMNODES instead of NODE_DATA(0)->node_id | 173 | * We need to use MAX_NUMNODES instead of NODE_DATA(0)->node_id |
170 | * because in some case like Node0 doesn't have RAM installed | 174 | * because in some case like Node0 doesn't have RAM installed |
171 | * low ram will be on Node1 | 175 | * low ram will be on Node1 |
172 | */ | 176 | */ |
173 | return free_low_memory_core_early(); | 177 | pages = free_low_memory_core_early(); |
178 | totalram_pages += pages; | ||
179 | |||
180 | return pages; | ||
174 | } | 181 | } |
175 | 182 | ||
176 | /** | 183 | /** |