diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2016-07-29 16:55:30 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-07-29 16:55:30 -0400 |
| commit | a6408f6cb63ac0958fee7dbce7861ffb540d8a49 (patch) | |
| tree | c94a835d343974171951e3b805e6bbbb02852ebc /arch/x86/kernel/apb_timer.c | |
| parent | 1a81a8f2a5918956e214bb718099a89e500e7ec5 (diff) | |
| parent | 4fae16dffb812f0e0d98a0b2b0856ca48ca63e6c (diff) | |
Merge branch 'smp-hotplug-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull smp hotplug updates from Thomas Gleixner:
"This is the next part of the hotplug rework.
- Convert all notifiers with a priority assigned
- Convert all CPU_STARTING/DYING notifiers
The final removal of the STARTING/DYING infrastructure will happen
when the merge window closes.
Another 700 hundred line of unpenetrable maze gone :)"
* 'smp-hotplug-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (70 commits)
timers/core: Correct callback order during CPU hot plug
leds/trigger/cpu: Move from CPU_STARTING to ONLINE level
powerpc/numa: Convert to hotplug state machine
arm/perf: Fix hotplug state machine conversion
irqchip/armada: Avoid unused function warnings
ARC/time: Convert to hotplug state machine
clocksource/atlas7: Convert to hotplug state machine
clocksource/armada-370-xp: Convert to hotplug state machine
clocksource/exynos_mct: Convert to hotplug state machine
clocksource/arm_global_timer: Convert to hotplug state machine
rcu: Convert rcutree to hotplug state machine
KVM/arm/arm64/vgic-new: Convert to hotplug state machine
smp/cfd: Convert core to hotplug state machine
x86/x2apic: Convert to CPU hotplug state machine
profile: Convert to hotplug state machine
timers/core: Convert to hotplug state machine
hrtimer: Convert to hotplug state machine
x86/tboot: Convert to hotplug state machine
arm64/armv8 deprecated: Convert to hotplug state machine
hwtracing/coresight-etm4x: Convert to hotplug state machine
...
Diffstat (limited to 'arch/x86/kernel/apb_timer.c')
| -rw-r--r-- | arch/x86/kernel/apb_timer.c | 29 |
1 files changed, 10 insertions, 19 deletions
diff --git a/arch/x86/kernel/apb_timer.c b/arch/x86/kernel/apb_timer.c index cefacbad1531..456316f6c868 100644 --- a/arch/x86/kernel/apb_timer.c +++ b/arch/x86/kernel/apb_timer.c | |||
| @@ -215,26 +215,18 @@ void apbt_setup_secondary_clock(void) | |||
| 215 | * cpu timers during the offline process due to the ordering of notification. | 215 | * cpu timers during the offline process due to the ordering of notification. |
| 216 | * the extra interrupt is harmless. | 216 | * the extra interrupt is harmless. |
| 217 | */ | 217 | */ |
| 218 | static int apbt_cpuhp_notify(struct notifier_block *n, | 218 | static int apbt_cpu_dead(unsigned int cpu) |
| 219 | unsigned long action, void *hcpu) | ||
| 220 | { | 219 | { |
| 221 | unsigned long cpu = (unsigned long)hcpu; | ||
| 222 | struct apbt_dev *adev = &per_cpu(cpu_apbt_dev, cpu); | 220 | struct apbt_dev *adev = &per_cpu(cpu_apbt_dev, cpu); |
| 223 | 221 | ||
| 224 | switch (action & ~CPU_TASKS_FROZEN) { | 222 | dw_apb_clockevent_pause(adev->timer); |
| 225 | case CPU_DEAD: | 223 | if (system_state == SYSTEM_RUNNING) { |
| 226 | dw_apb_clockevent_pause(adev->timer); | 224 | pr_debug("skipping APBT CPU %u offline\n", cpu); |
| 227 | if (system_state == SYSTEM_RUNNING) { | 225 | } else { |
| 228 | pr_debug("skipping APBT CPU %lu offline\n", cpu); | 226 | pr_debug("APBT clockevent for cpu %u offline\n", cpu); |
| 229 | } else { | 227 | dw_apb_clockevent_stop(adev->timer); |
| 230 | pr_debug("APBT clockevent for cpu %lu offline\n", cpu); | ||
| 231 | dw_apb_clockevent_stop(adev->timer); | ||
| 232 | } | ||
| 233 | break; | ||
| 234 | default: | ||
| 235 | pr_debug("APBT notified %lu, no action\n", action); | ||
| 236 | } | 228 | } |
| 237 | return NOTIFY_OK; | 229 | return 0; |
| 238 | } | 230 | } |
| 239 | 231 | ||
| 240 | static __init int apbt_late_init(void) | 232 | static __init int apbt_late_init(void) |
| @@ -242,9 +234,8 @@ static __init int apbt_late_init(void) | |||
| 242 | if (intel_mid_timer_options == INTEL_MID_TIMER_LAPIC_APBT || | 234 | if (intel_mid_timer_options == INTEL_MID_TIMER_LAPIC_APBT || |
| 243 | !apb_timer_block_enabled) | 235 | !apb_timer_block_enabled) |
| 244 | return 0; | 236 | return 0; |
| 245 | /* This notifier should be called after workqueue is ready */ | 237 | return cpuhp_setup_state(CPUHP_X86_APB_DEAD, "X86_APB_DEAD", NULL, |
| 246 | hotcpu_notifier(apbt_cpuhp_notify, -20); | 238 | apbt_cpu_dead); |
| 247 | return 0; | ||
| 248 | } | 239 | } |
| 249 | fs_initcall(apbt_late_init); | 240 | fs_initcall(apbt_late_init); |
| 250 | #else | 241 | #else |
