|
@@ -1523,12 +1523,16 @@ u64 get_next_timer_interrupt(unsigned long basej, u64 basem)
|
|
|
is_max_delta = (nextevt == base->clk + NEXT_TIMER_MAX_DELTA);
|
|
|
base->next_expiry = nextevt;
|
|
|
/*
|
|
|
- * We have a fresh next event. Check whether we can forward the base:
|
|
|
+ * We have a fresh next event. Check whether we can forward the
|
|
|
+ * base. We can only do that when @basej is past base->clk
|
|
|
+ * otherwise we might rewind base->clk.
|
|
|
*/
|
|
|
- if (time_after(nextevt, jiffies))
|
|
|
- base->clk = jiffies;
|
|
|
- else if (time_after(nextevt, base->clk))
|
|
|
- base->clk = nextevt;
|
|
|
+ if (time_after(basej, base->clk)) {
|
|
|
+ if (time_after(nextevt, basej))
|
|
|
+ base->clk = basej;
|
|
|
+ else if (time_after(nextevt, base->clk))
|
|
|
+ base->clk = nextevt;
|
|
|
+ }
|
|
|
|
|
|
if (time_before_eq(nextevt, basej)) {
|
|
|
expires = basem;
|