From: Ingo Molnar Date: Wed, 8 Oct 2008 09:31:02 +0000 (+0200) Subject: Merge branches 'sched/devel', 'sched/cpu-hotplug', 'sched/cpusets' and 'sched/urgent... X-Git-Tag: v2.6.28-rc1~725^2~2 X-Git-Url: http://www.pilppa.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=990d0f2ced23052abc7efa09bd05bff34e00cf73;hp=-c;p=linux-2.6-omap-h63xx.git Merge branches 'sched/devel', 'sched/cpu-hotplug', 'sched/cpusets' and 'sched/urgent' into sched/core --- 990d0f2ced23052abc7efa09bd05bff34e00cf73 diff --combined arch/ia64/kernel/smpboot.c index d8f05e504fb,d8f05e504fb,333b58f218d,d8f05e504fb..1dcbb85fc4e --- a/arch/ia64/kernel/smpboot.c +++ b/arch/ia64/kernel/smpboot.c @@@@@ -401,6 -401,6 -401,7 -401,6 +401,7 @@@@@ smp_callin (void spin_lock(&vector_lock); /* Setup the per cpu irq handling data structures */ __setup_vector_irq(cpuid); ++ + notify_cpu_starting(cpuid); cpu_set(cpuid, cpu_online_map); per_cpu(cpu_state, cpuid) = CPU_ONLINE; spin_unlock(&vector_lock); @@@@@ -741,14 -741,14 -742,16 -741,14 +742,14 @@@@@ int __cpu_disable(void return -EBUSY; } - cpu_clear(cpu, cpu_online_map); - if (migrate_platform_irqs(cpu)) { cpu_set(cpu, cpu_online_map); return (-EBUSY); } remove_siblinginfo(cpu); - cpu_clear(cpu, cpu_online_map); fixup_irqs(); + cpu_clear(cpu, cpu_online_map); local_flush_tlb_all(); cpu_clear(cpu, cpu_callin_map); return 0; diff --combined kernel/cpu.c index f17e9854c24,9e7ebde1331,dc45f2459ef,f17e9854c24..86d49045dae --- a/kernel/cpu.c +++ b/kernel/cpu.c @@@@@ -199,13 -199,14 -199,13 -199,13 +199,14 @@@@@ static int __ref take_cpu_down(void *_p struct take_cpu_down_param *param = _param; int err; - -- raw_notifier_call_chain(&cpu_chain, CPU_DYING | param->mod, - -- param->hcpu); /* Ensure this CPU doesn't handle any more interrupts. */ err = __cpu_disable(); if (err < 0) return err; + ++ raw_notifier_call_chain(&cpu_chain, CPU_DYING | param->mod, + ++ param->hcpu); + ++ /* Force idle task to run as soon as we yield: it should immediately notice cpu is offline and die quickly. */ sched_idle_next(); @@@@@ -453,6 -454,6 -453,25 -453,6 +454,25 @@@@@ out } #endif /* CONFIG_PM_SLEEP_SMP */ ++ +/** ++ + * notify_cpu_starting(cpu) - call the CPU_STARTING notifiers ++ + * @cpu: cpu that just started ++ + * ++ + * This function calls the cpu_chain notifiers with CPU_STARTING. ++ + * It must be called by the arch code on the new cpu, before the new cpu ++ + * enables interrupts and before the "boot" cpu returns from __cpu_up(). ++ + */ ++ +void notify_cpu_starting(unsigned int cpu) ++ +{ ++ + unsigned long val = CPU_STARTING; ++ + ++ +#ifdef CONFIG_PM_SLEEP_SMP ++ + if (cpu_isset(cpu, frozen_cpus)) ++ + val = CPU_STARTING_FROZEN; ++ +#endif /* CONFIG_PM_SLEEP_SMP */ ++ + raw_notifier_call_chain(&cpu_chain, val, (void *)(long)cpu); ++ +} ++ + #endif /* CONFIG_SMP */ /*