|
@@ -3032,7 +3032,7 @@ int numa_zonelist_order_handler(ctl_table *table, int write,
|
|
|
user_zonelist_order = oldval;
|
|
|
} else if (oldval != user_zonelist_order) {
|
|
|
mutex_lock(&zonelists_mutex);
|
|
|
- build_all_zonelists(NULL);
|
|
|
+ build_all_zonelists(NULL, NULL);
|
|
|
mutex_unlock(&zonelists_mutex);
|
|
|
}
|
|
|
}
|
|
@@ -3415,10 +3415,17 @@ static __init_refok int __build_all_zonelists(void *data)
|
|
|
{
|
|
|
int nid;
|
|
|
int cpu;
|
|
|
+ pg_data_t *self = data;
|
|
|
|
|
|
#ifdef CONFIG_NUMA
|
|
|
memset(node_load, 0, sizeof(node_load));
|
|
|
#endif
|
|
|
+
|
|
|
+ if (self && !node_online(self->node_id)) {
|
|
|
+ build_zonelists(self);
|
|
|
+ build_zonelist_cache(self);
|
|
|
+ }
|
|
|
+
|
|
|
for_each_online_node(nid) {
|
|
|
pg_data_t *pgdat = NODE_DATA(nid);
|
|
|
|
|
@@ -3463,7 +3470,7 @@ static __init_refok int __build_all_zonelists(void *data)
|
|
|
* Called with zonelists_mutex held always
|
|
|
* unless system_state == SYSTEM_BOOTING.
|
|
|
*/
|
|
|
-void __ref build_all_zonelists(void *data)
|
|
|
+void __ref build_all_zonelists(pg_data_t *pgdat, struct zone *zone)
|
|
|
{
|
|
|
set_zonelist_order();
|
|
|
|
|
@@ -3475,10 +3482,10 @@ void __ref build_all_zonelists(void *data)
|
|
|
/* we have to stop all cpus to guarantee there is no user
|
|
|
of zonelist */
|
|
|
#ifdef CONFIG_MEMORY_HOTPLUG
|
|
|
- if (data)
|
|
|
- setup_zone_pageset((struct zone *)data);
|
|
|
+ if (zone)
|
|
|
+ setup_zone_pageset(zone);
|
|
|
#endif
|
|
|
- stop_machine(__build_all_zonelists, NULL, NULL);
|
|
|
+ stop_machine(__build_all_zonelists, pgdat, NULL);
|
|
|
/* cpuset refresh routine should be here */
|
|
|
}
|
|
|
vm_total_pages = nr_free_pagecache_pages();
|