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 | |
| 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
| -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. |
