|
@@ -93,7 +93,17 @@ void tick_handle_periodic(struct clock_event_device *dev)
|
|
for (;;) {
|
|
for (;;) {
|
|
if (!clockevents_program_event(dev, next, ktime_get()))
|
|
if (!clockevents_program_event(dev, next, ktime_get()))
|
|
return;
|
|
return;
|
|
- tick_periodic(cpu);
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Have to be careful here. If we're in oneshot mode,
|
|
|
|
+ * before we call tick_periodic() in a loop, we need
|
|
|
|
+ * to be sure we're using a real hardware clocksource.
|
|
|
|
+ * Otherwise we could get trapped in an infinite
|
|
|
|
+ * loop, as the tick_periodic() increments jiffies,
|
|
|
|
+ * when then will increment time, posibly causing
|
|
|
|
+ * the loop to trigger again and again.
|
|
|
|
+ */
|
|
|
|
+ if (timekeeping_valid_for_hres())
|
|
|
|
+ tick_periodic(cpu);
|
|
next = ktime_add(next, tick_period);
|
|
next = ktime_add(next, tick_period);
|
|
}
|
|
}
|
|
}
|
|
}
|