|
@@ -141,8 +141,16 @@ static void clocksource_watchdog(unsigned long data)
|
|
}
|
|
}
|
|
|
|
|
|
if (!list_empty(&watchdog_list)) {
|
|
if (!list_empty(&watchdog_list)) {
|
|
- __mod_timer(&watchdog_timer,
|
|
|
|
- watchdog_timer.expires + WATCHDOG_INTERVAL);
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Cycle through CPUs to check if the CPUs stay
|
|
|
|
+ * synchronized to 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);
|
|
}
|
|
}
|
|
@@ -164,7 +172,8 @@ 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)
|
|
@@ -185,7 +194,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));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|