diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2008-09-22 19:04:02 +0200 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2008-09-23 11:38:53 +0200 |
commit | 27ce4cb4a0c7cf59b9a9952266883862f2e4c99f (patch) | |
tree | 066245d42877d8535853e3199b33cdf1110eb8e4 /kernel/time/tick-common.c | |
parent | clockevents: check broadcast device not tick device (diff) | |
download | linux-27ce4cb4a0c7cf59b9a9952266883862f2e4c99f.tar.xz linux-27ce4cb4a0c7cf59b9a9952266883862f2e4c99f.zip |
clockevents: prevent mode mismatch on cpu online
Impact: timer hang on CPU online observed on AMD C1E systems
When a CPU is brought online then the broadcast machinery can
be in the one shot state already. Check this and setup the timer
device of the new CPU in one shot mode so the broadcast code
can pick up the next_event value correctly.
Another AMD C1E oddity, as we switch to broadcast immediately and
not after the full bring up via the ACPI cpu idle code.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'kernel/time/tick-common.c')
-rw-r--r-- | kernel/time/tick-common.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/kernel/time/tick-common.c b/kernel/time/tick-common.c index b523d095decf..df12434b43ca 100644 --- a/kernel/time/tick-common.c +++ b/kernel/time/tick-common.c @@ -109,7 +109,8 @@ void tick_setup_periodic(struct clock_event_device *dev, int broadcast) if (!tick_device_is_functional(dev)) return; - if (dev->features & CLOCK_EVT_FEAT_PERIODIC) { + if ((dev->features & CLOCK_EVT_FEAT_PERIODIC) && + !tick_broadcast_oneshot_active()) { clockevents_set_mode(dev, CLOCK_EVT_MODE_PERIODIC); } else { unsigned long seq; |