aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/cpu.c
diff options
context:
space:
mode:
authorManfred Spraul <manfred@colorfullife.com>2008-09-07 10:57:22 -0400
committerIngo Molnar <mingo@elte.hu>2008-09-08 13:25:24 -0400
commite545a6140b698b2494daf0b32107bdcc5e901390 (patch)
tree63f302e25ba7a0705bbf051f3817fac8f8b98aba /kernel/cpu.c
parent7686ad5606f08d9dfb33a2087a36c8366366015b (diff)
kernel/cpu.c: create a CPU_STARTING cpu_chain notifier
Right now, there is no notifier that is called on a new cpu, before the new cpu begins processing interrupts/softirqs. Various kernel function would need that notification, e.g. kvm works around by calling smp_call_function_single(), rcu polls cpu_online_map. The patch adds a CPU_STARTING notification. It also adds a helper function that sends the message to all cpu_chain handlers. Tested on x86-64. All other archs are untested. Especially on sparc, I'm not sure if I got it right. Signed-off-by: Manfred Spraul <manfred@colorfullife.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel/cpu.c')
-rw-r--r--kernel/cpu.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/kernel/cpu.c b/kernel/cpu.c
index f17e9854c246..dc45f2459efb 100644
--- a/kernel/cpu.c
+++ b/kernel/cpu.c
@@ -453,6 +453,25 @@ out:
453} 453}
454#endif /* CONFIG_PM_SLEEP_SMP */ 454#endif /* CONFIG_PM_SLEEP_SMP */
455 455
456/**
457 * notify_cpu_starting(cpu) - call the CPU_STARTING notifiers
458 * @cpu: cpu that just started
459 *
460 * This function calls the cpu_chain notifiers with CPU_STARTING.
461 * It must be called by the arch code on the new cpu, before the new cpu
462 * enables interrupts and before the "boot" cpu returns from __cpu_up().
463 */
464void notify_cpu_starting(unsigned int cpu)
465{
466 unsigned long val = CPU_STARTING;
467
468#ifdef CONFIG_PM_SLEEP_SMP
469 if (cpu_isset(cpu, frozen_cpus))
470 val = CPU_STARTING_FROZEN;
471#endif /* CONFIG_PM_SLEEP_SMP */
472 raw_notifier_call_chain(&cpu_chain, val, (void *)(long)cpu);
473}
474
456#endif /* CONFIG_SMP */ 475#endif /* CONFIG_SMP */
457 476
458/* 477/*