• Frederic Weisbecker's avatar
    tick/nohz: Fix possible missing clock reprog after tick soft restart · 7bdb59f1
    Frederic Weisbecker authored
    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.
    
    Fix this with a ts->next_tick reset on soft tick restart.
    Signed-off-by: default avatarFrederic Weisbecker <fweisbec@gmail.com>
    Reviewed: Wanpeng Li <wanpeng.li@hotmail.com>
    Acked-by: default avatarRik van Riel <riel@redhat.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: stable@vger.kernel.org
    Link: http://lkml.kernel.org/r/1486485894-29173-1-git-send-email-fweisbec@gmail.comSigned-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    7bdb59f1
tick-sched.c 31.1 KB