2017-02-08 0:44 GMT+08:00 Frederic Weisbecker <fweisbec@xxxxxxxxx>: > ts->next_tick keeps track of the next tick deadline in order to optimize > clock programmation on irq exit and avoid redundant clock device writes. > > Now if ts->next_tick missed an update, we may spuriously miss a clock > reprog later as the nohz code is fooled by an obsolete next_tick value. > > This is what happens here on a specific path: when we observe an > expired timer from the nohz update code on irq exit, we perform a soft > tick restart which simply fires the closest possible tick without > actually exiting the nohz mode and restoring a periodic state. But we > forget to update ts->next_tick accordingly. > > As a result, after the next tick resulting from such soft tick restart, > the nohz code sees a stale value on ts->next_tick which doesn't match > the clock deadline that just expired. If that obsolete ts->next_tick > value happens to collide with the actual next tick deadline to be > scheduled, we may spuriously bypass the clock reprogramming. In the > worst case, the tick may never fire again. > > Lets fix this with a ts->next_tick reset on soft tick restart. > > Signed-off-by: Frederic Weisbecker <fweisbec@xxxxxxxxx> > Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx> > Cc: Wanpeng Li <wanpeng.li@xxxxxxxxxxx> > Cc: Peter Zijlstra <peterz@xxxxxxxxxxxxx> > Cc: Rik van Riel <riel@xxxxxxxxxx> > Cc: Ingo Molnar <mingo@xxxxxxxxxx> > Cc: stable@xxxxxxxxxxxxxxx Reviewed-by: Wanpeng Li <wanpeng.li@xxxxxxxxxxx> > --- > kernel/time/tick-sched.c | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c > index 74e0388..fc6f740 100644 > --- a/kernel/time/tick-sched.c > +++ b/kernel/time/tick-sched.c > @@ -725,6 +725,11 @@ static ktime_t tick_nohz_stop_sched_tick(struct tick_sched *ts, > */ > if (delta == 0) { > tick_nohz_restart(ts, now); > + /* > + * Make sure next tick stop doesn't get fooled by past > + * clock deadline > + */ > + ts->next_tick = 0; > goto out; > } > } > -- > 2.7.4 > -- To unsubscribe from this list: send the line "unsubscribe stable" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html