diff options
| author | Manfred Spraul <manfred@colorfullife.com> | 2008-09-07 10:57:22 -0400 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2008-09-08 13:25:24 -0400 |
| commit | e545a6140b698b2494daf0b32107bdcc5e901390 (patch) | |
| tree | 63f302e25ba7a0705bbf051f3817fac8f8b98aba /kernel | |
| parent | 7686ad5606f08d9dfb33a2087a36c8366366015b (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')
| -rw-r--r-- | kernel/cpu.c | 19 |
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 | */ | ||
| 464 | void 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 | /* |
