aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/cpuset.c6
-rw-r--r--kernel/sched.c22
2 files changed, 28 insertions, 0 deletions
diff --git a/kernel/cpuset.c b/kernel/cpuset.c
index 86ea9e34e326..6090d18b58a9 100644
--- a/kernel/cpuset.c
+++ b/kernel/cpuset.c
@@ -1886,6 +1886,12 @@ static void common_cpu_mem_hotplug_unplug(void)
1886 top_cpuset.mems_allowed = node_states[N_HIGH_MEMORY]; 1886 top_cpuset.mems_allowed = node_states[N_HIGH_MEMORY];
1887 scan_for_empty_cpusets(&top_cpuset); 1887 scan_for_empty_cpusets(&top_cpuset);
1888 1888
1889 /*
1890 * Scheduler destroys domains on hotplug events.
1891 * Rebuild them based on the current settings.
1892 */
1893 rebuild_sched_domains();
1894
1889 cgroup_unlock(); 1895 cgroup_unlock();
1890} 1896}
1891 1897
diff --git a/kernel/sched.c b/kernel/sched.c
index f0ed81b71282..1ddb0a8c7976 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -7293,6 +7293,18 @@ void __attribute__((weak)) arch_update_cpu_topology(void)
7293} 7293}
7294 7294
7295/* 7295/*
7296 * Free current domain masks.
7297 * Called after all cpus are attached to NULL domain.
7298 */
7299static void free_sched_domains(void)
7300{
7301 ndoms_cur = 0;
7302 if (doms_cur != &fallback_doms)
7303 kfree(doms_cur);
7304 doms_cur = &fallback_doms;
7305}
7306
7307/*
7296 * Set up scheduler domains and groups. Callers must hold the hotplug lock. 7308 * Set up scheduler domains and groups. Callers must hold the hotplug lock.
7297 * For now this just excludes isolated cpus, but could be used to 7309 * For now this just excludes isolated cpus, but could be used to
7298 * exclude other special cases in the future. 7310 * exclude other special cases in the future.
@@ -7439,6 +7451,7 @@ int arch_reinit_sched_domains(void)
7439 get_online_cpus(); 7451 get_online_cpus();
7440 mutex_lock(&sched_domains_mutex); 7452 mutex_lock(&sched_domains_mutex);
7441 detach_destroy_domains(&cpu_online_map); 7453 detach_destroy_domains(&cpu_online_map);
7454 free_sched_domains();
7442 err = arch_init_sched_domains(&cpu_online_map); 7455 err = arch_init_sched_domains(&cpu_online_map);
7443 mutex_unlock(&sched_domains_mutex); 7456 mutex_unlock(&sched_domains_mutex);
7444 put_online_cpus(); 7457 put_online_cpus();
@@ -7524,6 +7537,7 @@ static int update_sched_domains(struct notifier_block *nfb,
7524 case CPU_DOWN_PREPARE: 7537 case CPU_DOWN_PREPARE:
7525 case CPU_DOWN_PREPARE_FROZEN: 7538 case CPU_DOWN_PREPARE_FROZEN:
7526 detach_destroy_domains(&cpu_online_map); 7539 detach_destroy_domains(&cpu_online_map);
7540 free_sched_domains();
7527 return NOTIFY_OK; 7541 return NOTIFY_OK;
7528 7542
7529 case CPU_UP_CANCELED: 7543 case CPU_UP_CANCELED:
@@ -7542,8 +7556,16 @@ static int update_sched_domains(struct notifier_block *nfb,
7542 return NOTIFY_DONE; 7556 return NOTIFY_DONE;
7543 } 7557 }
7544 7558
7559#ifndef CONFIG_CPUSETS
7560 /*
7561 * Create default domain partitioning if cpusets are disabled.
7562 * Otherwise we let cpusets rebuild the domains based on the
7563 * current setup.
7564 */
7565
7545 /* The hotplug lock is already held by cpu_up/cpu_down */ 7566 /* The hotplug lock is already held by cpu_up/cpu_down */
7546 arch_init_sched_domains(&cpu_online_map); 7567 arch_init_sched_domains(&cpu_online_map);
7568#endif
7547 7569
7548 return NOTIFY_OK; 7570 return NOTIFY_OK;
7549} 7571}