|
@@ -2080,14 +2080,35 @@ static void build_zonelist_cache(pg_data_t *pgdat)
|
|
|
|
|
|
#endif /* CONFIG_NUMA */
|
|
|
|
|
|
+/* Any regular memory on that node ? */
|
|
|
+static void check_for_regular_memory(pg_data_t *pgdat)
|
|
|
+{
|
|
|
+#ifdef CONFIG_HIGHMEM
|
|
|
+ enum zone_type zone_type;
|
|
|
+
|
|
|
+ for (zone_type = 0; zone_type <= ZONE_NORMAL; zone_type++) {
|
|
|
+ struct zone *zone = &pgdat->node_zones[zone_type];
|
|
|
+ if (zone->present_pages)
|
|
|
+ node_set_state(zone_to_nid(zone), N_NORMAL_MEMORY);
|
|
|
+ }
|
|
|
+#endif
|
|
|
+}
|
|
|
+
|
|
|
/* return values int ....just for stop_machine_run() */
|
|
|
static int __build_all_zonelists(void *dummy)
|
|
|
{
|
|
|
int nid;
|
|
|
|
|
|
for_each_online_node(nid) {
|
|
|
- build_zonelists(NODE_DATA(nid));
|
|
|
- build_zonelist_cache(NODE_DATA(nid));
|
|
|
+ pg_data_t *pgdat = NODE_DATA(nid);
|
|
|
+
|
|
|
+ build_zonelists(pgdat);
|
|
|
+ build_zonelist_cache(pgdat);
|
|
|
+
|
|
|
+ /* Any memory on that node */
|
|
|
+ if (pgdat->node_present_pages)
|
|
|
+ node_set_state(nid, N_HIGH_MEMORY);
|
|
|
+ check_for_regular_memory(pgdat);
|
|
|
}
|
|
|
return 0;
|
|
|
}
|