Commit 1ada5cba authored by Andi Kleen's avatar Andi Kleen Committed by Ingo Molnar

clocksource: make clocksource watchdog cycle through online CPUs

This way it checks if the clocks are synchronized between CPUs too.
This might be able to detect slowly drifting TSCs which only
go wrong over longer time.
Signed-off-by: default avatarAndi Kleen <ak@suse.de>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent 1077f5a9
...@@ -142,8 +142,13 @@ static void clocksource_watchdog(unsigned long data) ...@@ -142,8 +142,13 @@ static void clocksource_watchdog(unsigned long data)
} }
if (!list_empty(&watchdog_list)) { if (!list_empty(&watchdog_list)) {
__mod_timer(&watchdog_timer, /* Cycle through CPUs to check if the CPUs stay synchronized to
watchdog_timer.expires + WATCHDOG_INTERVAL); * each other. */
int next_cpu = next_cpu(raw_smp_processor_id(), cpu_online_map);
if (next_cpu >= NR_CPUS)
next_cpu = first_cpu(cpu_online_map);
watchdog_timer.expires += WATCHDOG_INTERVAL;
add_timer_on(&watchdog_timer, next_cpu);
} }
spin_unlock(&watchdog_lock); spin_unlock(&watchdog_lock);
} }
...@@ -165,7 +170,7 @@ static void clocksource_check_watchdog(struct clocksource *cs) ...@@ -165,7 +170,7 @@ static void clocksource_check_watchdog(struct clocksource *cs)
if (!started && watchdog) { if (!started && watchdog) {
watchdog_last = watchdog->read(); watchdog_last = watchdog->read();
watchdog_timer.expires = jiffies + WATCHDOG_INTERVAL; watchdog_timer.expires = jiffies + WATCHDOG_INTERVAL;
add_timer(&watchdog_timer); add_timer_on(&watchdog_timer, first_cpu(cpu_online_map));
} }
} else { } else {
if (cs->flags & CLOCK_SOURCE_IS_CONTINUOUS) if (cs->flags & CLOCK_SOURCE_IS_CONTINUOUS)
...@@ -186,7 +191,8 @@ static void clocksource_check_watchdog(struct clocksource *cs) ...@@ -186,7 +191,8 @@ static void clocksource_check_watchdog(struct clocksource *cs)
watchdog_last = watchdog->read(); watchdog_last = watchdog->read();
watchdog_timer.expires = watchdog_timer.expires =
jiffies + WATCHDOG_INTERVAL; jiffies + WATCHDOG_INTERVAL;
add_timer(&watchdog_timer); add_timer_on(&watchdog_timer,
first_cpu(cpu_online_map));
} }
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment