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/arc/kernel | |
| 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/arc/kernel')
| -rw-r--r-- | arch/arc/kernel/time.c | 48 |
1 files changed, 18 insertions, 30 deletions
diff --git a/arch/arc/kernel/time.c b/arch/arc/kernel/time.c index 98f22d2eb563..f927b8dc6edd 100644 --- a/arch/arc/kernel/time.c +++ b/arch/arc/kernel/time.c | |||
| @@ -296,30 +296,23 @@ static irqreturn_t timer_irq_handler(int irq, void *dev_id) | |||
| 296 | return IRQ_HANDLED; | 296 | return IRQ_HANDLED; |
| 297 | } | 297 | } |
| 298 | 298 | ||
| 299 | static int arc_timer_cpu_notify(struct notifier_block *self, | 299 | |
| 300 | unsigned long action, void *hcpu) | 300 | static int arc_timer_starting_cpu(unsigned int cpu) |
| 301 | { | 301 | { |
| 302 | struct clock_event_device *evt = this_cpu_ptr(&arc_clockevent_device); | 302 | struct clock_event_device *evt = this_cpu_ptr(&arc_clockevent_device); |
| 303 | 303 | ||
| 304 | evt->cpumask = cpumask_of(smp_processor_id()); | 304 | evt->cpumask = cpumask_of(smp_processor_id()); |
| 305 | 305 | ||
| 306 | switch (action & ~CPU_TASKS_FROZEN) { | 306 | clockevents_config_and_register(evt, arc_timer_freq, 0, ARC_TIMER_MAX); |
| 307 | case CPU_STARTING: | 307 | enable_percpu_irq(arc_timer_irq, 0); |
| 308 | clockevents_config_and_register(evt, arc_timer_freq, | 308 | return 0; |
| 309 | 0, ULONG_MAX); | ||
| 310 | enable_percpu_irq(arc_timer_irq, 0); | ||
| 311 | break; | ||
| 312 | case CPU_DYING: | ||
| 313 | disable_percpu_irq(arc_timer_irq); | ||
| 314 | break; | ||
| 315 | } | ||
| 316 | |||
| 317 | return NOTIFY_OK; | ||
| 318 | } | 309 | } |
| 319 | 310 | ||
| 320 | static struct notifier_block arc_timer_cpu_nb = { | 311 | static int arc_timer_dying_cpu(unsigned int cpu) |
| 321 | .notifier_call = arc_timer_cpu_notify, | 312 | { |
| 322 | }; | 313 | disable_percpu_irq(arc_timer_irq); |
| 314 | return 0; | ||
| 315 | } | ||
| 323 | 316 | ||
| 324 | /* | 317 | /* |
| 325 | * clockevent setup for boot CPU | 318 | * clockevent setup for boot CPU |
| @@ -329,12 +322,6 @@ static int __init arc_clockevent_setup(struct device_node *node) | |||
| 329 | struct clock_event_device *evt = this_cpu_ptr(&arc_clockevent_device); | 322 | struct clock_event_device *evt = this_cpu_ptr(&arc_clockevent_device); |
| 330 | int ret; | 323 | int ret; |
| 331 | 324 | ||
| 332 | ret = register_cpu_notifier(&arc_timer_cpu_nb); | ||
| 333 | if (ret) { | ||
| 334 | pr_err("Failed to register cpu notifier"); | ||
| 335 | return ret; | ||
| 336 | } | ||
| 337 | |||
| 338 | arc_timer_irq = irq_of_parse_and_map(node, 0); | 325 | arc_timer_irq = irq_of_parse_and_map(node, 0); |
| 339 | if (arc_timer_irq <= 0) { | 326 | if (arc_timer_irq <= 0) { |
| 340 | pr_err("clockevent: missing irq"); | 327 | pr_err("clockevent: missing irq"); |
| @@ -347,11 +334,6 @@ static int __init arc_clockevent_setup(struct device_node *node) | |||
| 347 | return ret; | 334 | return ret; |
| 348 | } | 335 | } |
| 349 | 336 | ||
| 350 | evt->irq = arc_timer_irq; | ||
| 351 | evt->cpumask = cpumask_of(smp_processor_id()); | ||
| 352 | clockevents_config_and_register(evt, arc_timer_freq, | ||
| 353 | 0, ARC_TIMER_MAX); | ||
| 354 | |||
| 355 | /* Needs apriori irq_set_percpu_devid() done in intc map function */ | 337 | /* Needs apriori irq_set_percpu_devid() done in intc map function */ |
| 356 | ret = request_percpu_irq(arc_timer_irq, timer_irq_handler, | 338 | ret = request_percpu_irq(arc_timer_irq, timer_irq_handler, |
| 357 | "Timer0 (per-cpu-tick)", evt); | 339 | "Timer0 (per-cpu-tick)", evt); |
| @@ -360,8 +342,14 @@ static int __init arc_clockevent_setup(struct device_node *node) | |||
| 360 | return ret; | 342 | return ret; |
| 361 | } | 343 | } |
| 362 | 344 | ||
| 363 | enable_percpu_irq(arc_timer_irq, 0); | 345 | ret = cpuhp_setup_state(CPUHP_AP_ARC_TIMER_STARTING, |
| 364 | 346 | "AP_ARC_TIMER_STARTING", | |
| 347 | arc_timer_starting_cpu, | ||
| 348 | arc_timer_dying_cpu); | ||
| 349 | if (ret) { | ||
| 350 | pr_err("Failed to setup hotplug state"); | ||
| 351 | return ret; | ||
| 352 | } | ||
| 365 | return 0; | 353 | return 0; |
| 366 | } | 354 | } |
| 367 | 355 | ||
