diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-06-29 13:27:19 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-06-29 13:27:19 -0400 |
commit | a75930c6332f39bfe05059259e13cdee54933f9f (patch) | |
tree | e92a45d119cf8a8f7694669169c93971be9f5bbe /kernel | |
parent | 82d0b80ad6346cee3200b7c7bb1fc975481b7703 (diff) | |
parent | ea8deb8dfa6b0e8d1b3d1051585706739b46656c (diff) |
Merge branch 'timers-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull timer fix from Thomas Gleixner:
"Correct an ordering issue in the tick broadcast code. I really wish
we'd get compensation for pain and suffering for each line of code we
write to work around dysfunctional timer hardware."
* 'timers-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
tick: Fix tick_broadcast_pending_mask not cleared
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/time/tick-broadcast.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c index b4c245580b79..20d6fba70652 100644 --- a/kernel/time/tick-broadcast.c +++ b/kernel/time/tick-broadcast.c | |||
@@ -599,8 +599,6 @@ void tick_broadcast_oneshot_control(unsigned long reason) | |||
599 | } else { | 599 | } else { |
600 | if (cpumask_test_and_clear_cpu(cpu, tick_broadcast_oneshot_mask)) { | 600 | if (cpumask_test_and_clear_cpu(cpu, tick_broadcast_oneshot_mask)) { |
601 | clockevents_set_mode(dev, CLOCK_EVT_MODE_ONESHOT); | 601 | clockevents_set_mode(dev, CLOCK_EVT_MODE_ONESHOT); |
602 | if (dev->next_event.tv64 == KTIME_MAX) | ||
603 | goto out; | ||
604 | /* | 602 | /* |
605 | * The cpu which was handling the broadcast | 603 | * The cpu which was handling the broadcast |
606 | * timer marked this cpu in the broadcast | 604 | * timer marked this cpu in the broadcast |
@@ -615,6 +613,11 @@ void tick_broadcast_oneshot_control(unsigned long reason) | |||
615 | goto out; | 613 | goto out; |
616 | 614 | ||
617 | /* | 615 | /* |
616 | * Bail out if there is no next event. | ||
617 | */ | ||
618 | if (dev->next_event.tv64 == KTIME_MAX) | ||
619 | goto out; | ||
620 | /* | ||
618 | * If the pending bit is not set, then we are | 621 | * If the pending bit is not set, then we are |
619 | * either the CPU handling the broadcast | 622 | * either the CPU handling the broadcast |
620 | * interrupt or we got woken by something else. | 623 | * interrupt or we got woken by something else. |