aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/sched.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/sched.c')
-rw-r--r--kernel/sched.c108
1 files changed, 45 insertions, 63 deletions
diff --git a/kernel/sched.c b/kernel/sched.c
index 1ee18dbb4516..c237624a8a04 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -2881,7 +2881,7 @@ static void sched_migrate_task(struct task_struct *p, int dest_cpu)
2881 2881
2882 rq = task_rq_lock(p, &flags); 2882 rq = task_rq_lock(p, &flags);
2883 if (!cpu_isset(dest_cpu, p->cpus_allowed) 2883 if (!cpu_isset(dest_cpu, p->cpus_allowed)
2884 || unlikely(cpu_is_offline(dest_cpu))) 2884 || unlikely(!cpu_active(dest_cpu)))
2885 goto out; 2885 goto out;
2886 2886
2887 /* force the process onto the specified CPU */ 2887 /* force the process onto the specified CPU */
@@ -3849,7 +3849,7 @@ int select_nohz_load_balancer(int stop_tick)
3849 /* 3849 /*
3850 * If we are going offline and still the leader, give up! 3850 * If we are going offline and still the leader, give up!
3851 */ 3851 */
3852 if (cpu_is_offline(cpu) && 3852 if (!cpu_active(cpu) &&
3853 atomic_read(&nohz.load_balancer) == cpu) { 3853 atomic_read(&nohz.load_balancer) == cpu) {
3854 if (atomic_cmpxchg(&nohz.load_balancer, cpu, -1) != cpu) 3854 if (atomic_cmpxchg(&nohz.load_balancer, cpu, -1) != cpu)
3855 BUG(); 3855 BUG();
@@ -5876,7 +5876,7 @@ static int __migrate_task(struct task_struct *p, int src_cpu, int dest_cpu)
5876 struct rq *rq_dest, *rq_src; 5876 struct rq *rq_dest, *rq_src;
5877 int ret = 0, on_rq; 5877 int ret = 0, on_rq;
5878 5878
5879 if (unlikely(cpu_is_offline(dest_cpu))) 5879 if (unlikely(!cpu_active(dest_cpu)))
5880 return ret; 5880 return ret;
5881 5881
5882 rq_src = cpu_rq(src_cpu); 5882 rq_src = cpu_rq(src_cpu);
@@ -7554,18 +7554,6 @@ void __attribute__((weak)) arch_update_cpu_topology(void)
7554} 7554}
7555 7555
7556/* 7556/*
7557 * Free current domain masks.
7558 * Called after all cpus are attached to NULL domain.
7559 */
7560static void free_sched_domains(void)
7561{
7562 ndoms_cur = 0;
7563 if (doms_cur != &fallback_doms)
7564 kfree(doms_cur);
7565 doms_cur = &fallback_doms;
7566}
7567
7568/*
7569 * Set up scheduler domains and groups. Callers must hold the hotplug lock. 7557 * Set up scheduler domains and groups. Callers must hold the hotplug lock.
7570 * For now this just excludes isolated cpus, but could be used to 7558 * For now this just excludes isolated cpus, but could be used to
7571 * exclude other special cases in the future. 7559 * exclude other special cases in the future.
@@ -7643,7 +7631,7 @@ static int dattrs_equal(struct sched_domain_attr *cur, int idx_cur,
7643 * ownership of it and will kfree it when done with it. If the caller 7631 * ownership of it and will kfree it when done with it. If the caller
7644 * failed the kmalloc call, then it can pass in doms_new == NULL, 7632 * failed the kmalloc call, then it can pass in doms_new == NULL,
7645 * and partition_sched_domains() will fallback to the single partition 7633 * and partition_sched_domains() will fallback to the single partition
7646 * 'fallback_doms'. 7634 * 'fallback_doms', it also forces the domains to be rebuilt.
7647 * 7635 *
7648 * Call with hotplug lock held 7636 * Call with hotplug lock held
7649 */ 7637 */
@@ -7657,12 +7645,8 @@ void partition_sched_domains(int ndoms_new, cpumask_t *doms_new,
7657 /* always unregister in case we don't destroy any domains */ 7645 /* always unregister in case we don't destroy any domains */
7658 unregister_sched_domain_sysctl(); 7646 unregister_sched_domain_sysctl();
7659 7647
7660 if (doms_new == NULL) { 7648 if (doms_new == NULL)
7661 ndoms_new = 1; 7649 ndoms_new = 0;
7662 doms_new = &fallback_doms;
7663 cpus_andnot(doms_new[0], cpu_online_map, cpu_isolated_map);
7664 dattr_new = NULL;
7665 }
7666 7650
7667 /* Destroy deleted domains */ 7651 /* Destroy deleted domains */
7668 for (i = 0; i < ndoms_cur; i++) { 7652 for (i = 0; i < ndoms_cur; i++) {
@@ -7677,6 +7661,14 @@ match1:
7677 ; 7661 ;
7678 } 7662 }
7679 7663
7664 if (doms_new == NULL) {
7665 ndoms_cur = 0;
7666 ndoms_new = 1;
7667 doms_new = &fallback_doms;
7668 cpus_andnot(doms_new[0], cpu_online_map, cpu_isolated_map);
7669 dattr_new = NULL;
7670 }
7671
7680 /* Build new domains */ 7672 /* Build new domains */
7681 for (i = 0; i < ndoms_new; i++) { 7673 for (i = 0; i < ndoms_new; i++) {
7682 for (j = 0; j < ndoms_cur; j++) { 7674 for (j = 0; j < ndoms_cur; j++) {
@@ -7707,17 +7699,10 @@ match2:
7707#if defined(CONFIG_SCHED_MC) || defined(CONFIG_SCHED_SMT) 7699#if defined(CONFIG_SCHED_MC) || defined(CONFIG_SCHED_SMT)
7708int arch_reinit_sched_domains(void) 7700int arch_reinit_sched_domains(void)
7709{ 7701{
7710 int err;
7711
7712 get_online_cpus(); 7702 get_online_cpus();
7713 mutex_lock(&sched_domains_mutex); 7703 rebuild_sched_domains();
7714 detach_destroy_domains(&cpu_online_map);
7715 free_sched_domains();
7716 err = arch_init_sched_domains(&cpu_online_map);
7717 mutex_unlock(&sched_domains_mutex);
7718 put_online_cpus(); 7704 put_online_cpus();
7719 7705 return 0;
7720 return err;
7721} 7706}
7722 7707
7723static ssize_t sched_power_savings_store(const char *buf, size_t count, int smt) 7708static ssize_t sched_power_savings_store(const char *buf, size_t count, int smt)
@@ -7783,59 +7768,49 @@ int sched_create_sysfs_power_savings_entries(struct sysdev_class *cls)
7783} 7768}
7784#endif /* CONFIG_SCHED_MC || CONFIG_SCHED_SMT */ 7769#endif /* CONFIG_SCHED_MC || CONFIG_SCHED_SMT */
7785 7770
7771#ifndef CONFIG_CPUSETS
7786/* 7772/*
7787 * Force a reinitialization of the sched domains hierarchy. The domains 7773 * Add online and remove offline CPUs from the scheduler domains.
7788 * and groups cannot be updated in place without racing with the balancing 7774 * When cpusets are enabled they take over this function.
7789 * code, so we temporarily attach all running cpus to the NULL domain
7790 * which will prevent rebalancing while the sched domains are recalculated.
7791 */ 7775 */
7792static int update_sched_domains(struct notifier_block *nfb, 7776static int update_sched_domains(struct notifier_block *nfb,
7793 unsigned long action, void *hcpu) 7777 unsigned long action, void *hcpu)
7794{ 7778{
7779 switch (action) {
7780 case CPU_ONLINE:
7781 case CPU_ONLINE_FROZEN:
7782 case CPU_DEAD:
7783 case CPU_DEAD_FROZEN:
7784 partition_sched_domains(0, NULL, NULL);
7785 return NOTIFY_OK;
7786
7787 default:
7788 return NOTIFY_DONE;
7789 }
7790}
7791#endif
7792
7793static int update_runtime(struct notifier_block *nfb,
7794 unsigned long action, void *hcpu)
7795{
7795 int cpu = (int)(long)hcpu; 7796 int cpu = (int)(long)hcpu;
7796 7797
7797 switch (action) { 7798 switch (action) {
7798 case CPU_DOWN_PREPARE: 7799 case CPU_DOWN_PREPARE:
7799 case CPU_DOWN_PREPARE_FROZEN: 7800 case CPU_DOWN_PREPARE_FROZEN:
7800 disable_runtime(cpu_rq(cpu)); 7801 disable_runtime(cpu_rq(cpu));
7801 /* fall-through */
7802 case CPU_UP_PREPARE:
7803 case CPU_UP_PREPARE_FROZEN:
7804 detach_destroy_domains(&cpu_online_map);
7805 free_sched_domains();
7806 return NOTIFY_OK; 7802 return NOTIFY_OK;
7807 7803
7808
7809 case CPU_DOWN_FAILED: 7804 case CPU_DOWN_FAILED:
7810 case CPU_DOWN_FAILED_FROZEN: 7805 case CPU_DOWN_FAILED_FROZEN:
7811 case CPU_ONLINE: 7806 case CPU_ONLINE:
7812 case CPU_ONLINE_FROZEN: 7807 case CPU_ONLINE_FROZEN:
7813 enable_runtime(cpu_rq(cpu)); 7808 enable_runtime(cpu_rq(cpu));
7814 /* fall-through */ 7809 return NOTIFY_OK;
7815 case CPU_UP_CANCELED: 7810
7816 case CPU_UP_CANCELED_FROZEN:
7817 case CPU_DEAD:
7818 case CPU_DEAD_FROZEN:
7819 /*
7820 * Fall through and re-initialise the domains.
7821 */
7822 break;
7823 default: 7811 default:
7824 return NOTIFY_DONE; 7812 return NOTIFY_DONE;
7825 } 7813 }
7826
7827#ifndef CONFIG_CPUSETS
7828 /*
7829 * Create default domain partitioning if cpusets are disabled.
7830 * Otherwise we let cpusets rebuild the domains based on the
7831 * current setup.
7832 */
7833
7834 /* The hotplug lock is already held by cpu_up/cpu_down */
7835 arch_init_sched_domains(&cpu_online_map);
7836#endif
7837
7838 return NOTIFY_OK;
7839} 7814}
7840 7815
7841void __init sched_init_smp(void) 7816void __init sched_init_smp(void)
@@ -7855,8 +7830,15 @@ void __init sched_init_smp(void)
7855 cpu_set(smp_processor_id(), non_isolated_cpus); 7830 cpu_set(smp_processor_id(), non_isolated_cpus);
7856 mutex_unlock(&sched_domains_mutex); 7831 mutex_unlock(&sched_domains_mutex);
7857 put_online_cpus(); 7832 put_online_cpus();
7833
7834#ifndef CONFIG_CPUSETS
7858 /* XXX: Theoretical race here - CPU may be hotplugged now */ 7835 /* XXX: Theoretical race here - CPU may be hotplugged now */
7859 hotcpu_notifier(update_sched_domains, 0); 7836 hotcpu_notifier(update_sched_domains, 0);
7837#endif
7838
7839 /* RT runtime code needs to handle some hotplug events */
7840 hotcpu_notifier(update_runtime, 0);
7841
7860 init_hrtick(); 7842 init_hrtick();
7861 7843
7862 /* Move init over to a non-isolated CPU */ 7844 /* Move init over to a non-isolated CPU */