diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/hrtimer.c | 4 | ||||
| -rw-r--r-- | kernel/time/tick-common.c | 26 |
2 files changed, 23 insertions, 7 deletions
diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c index 8fea312ca36c..647a40e2fea1 100644 --- a/kernel/hrtimer.c +++ b/kernel/hrtimer.c | |||
| @@ -1608,6 +1608,10 @@ static int __cpuinit hrtimer_cpu_notify(struct notifier_block *self, | |||
| 1608 | break; | 1608 | break; |
| 1609 | 1609 | ||
| 1610 | #ifdef CONFIG_HOTPLUG_CPU | 1610 | #ifdef CONFIG_HOTPLUG_CPU |
| 1611 | case CPU_DYING: | ||
| 1612 | case CPU_DYING_FROZEN: | ||
| 1613 | clockevents_notify(CLOCK_EVT_NOTIFY_CPU_DYING, &scpu); | ||
| 1614 | break; | ||
| 1611 | case CPU_DEAD: | 1615 | case CPU_DEAD: |
| 1612 | case CPU_DEAD_FROZEN: | 1616 | case CPU_DEAD_FROZEN: |
| 1613 | { | 1617 | { |
diff --git a/kernel/time/tick-common.c b/kernel/time/tick-common.c index 63e05d423a09..21a5ca849514 100644 --- a/kernel/time/tick-common.c +++ b/kernel/time/tick-common.c | |||
| @@ -274,6 +274,21 @@ out_bc: | |||
| 274 | } | 274 | } |
| 275 | 275 | ||
| 276 | /* | 276 | /* |
| 277 | * Transfer the do_timer job away from a dying cpu. | ||
| 278 | * | ||
| 279 | * Called with interrupts disabled. | ||
| 280 | */ | ||
| 281 | static void tick_handover_do_timer(int *cpup) | ||
| 282 | { | ||
| 283 | if (*cpup == tick_do_timer_cpu) { | ||
| 284 | int cpu = cpumask_first(cpu_online_mask); | ||
| 285 | |||
| 286 | tick_do_timer_cpu = (cpu < nr_cpu_ids) ? cpu : | ||
| 287 | TICK_DO_TIMER_NONE; | ||
| 288 | } | ||
| 289 | } | ||
| 290 | |||
| 291 | /* | ||
| 277 | * Shutdown an event device on a given cpu: | 292 | * Shutdown an event device on a given cpu: |
| 278 | * | 293 | * |
| 279 | * This is called on a life CPU, when a CPU is dead. So we cannot | 294 | * This is called on a life CPU, when a CPU is dead. So we cannot |
| @@ -297,13 +312,6 @@ static void tick_shutdown(unsigned int *cpup) | |||
| 297 | clockevents_exchange_device(dev, NULL); | 312 | clockevents_exchange_device(dev, NULL); |
| 298 | td->evtdev = NULL; | 313 | td->evtdev = NULL; |
| 299 | } | 314 | } |
| 300 | /* Transfer the do_timer job away from this cpu */ | ||
| 301 | if (*cpup == tick_do_timer_cpu) { | ||
| 302 | int cpu = cpumask_first(cpu_online_mask); | ||
| 303 | |||
| 304 | tick_do_timer_cpu = (cpu < nr_cpu_ids) ? cpu : | ||
| 305 | TICK_DO_TIMER_NONE; | ||
| 306 | } | ||
| 307 | spin_unlock_irqrestore(&tick_device_lock, flags); | 315 | spin_unlock_irqrestore(&tick_device_lock, flags); |
| 308 | } | 316 | } |
| 309 | 317 | ||
| @@ -357,6 +365,10 @@ static int tick_notify(struct notifier_block *nb, unsigned long reason, | |||
| 357 | tick_broadcast_oneshot_control(reason); | 365 | tick_broadcast_oneshot_control(reason); |
| 358 | break; | 366 | break; |
| 359 | 367 | ||
| 368 | case CLOCK_EVT_NOTIFY_CPU_DYING: | ||
| 369 | tick_handover_do_timer(dev); | ||
| 370 | break; | ||
| 371 | |||
| 360 | case CLOCK_EVT_NOTIFY_CPU_DEAD: | 372 | case CLOCK_EVT_NOTIFY_CPU_DEAD: |
| 361 | tick_shutdown_broadcast_oneshot(dev); | 373 | tick_shutdown_broadcast_oneshot(dev); |
| 362 | tick_shutdown_broadcast(dev); | 374 | tick_shutdown_broadcast(dev); |
