• Anna-Maria Behnsen's avatar
    timers: Use only bucket expiry for base->next_expiry value · 1f32cab0
    Anna-Maria Behnsen authored
    The bucket expiry time is the effective expriy time of timers and is
    greater than or equal to the requested timer expiry time. This is due
    to the guarantee that timers never expire early and the reduced expiry
    granularity in the secondary wheel levels.
    
    When a timer is enqueued, trigger_dyntick_cpu() checks whether the
    timer is the new first timer. This check compares next_expiry with
    the requested timer expiry value and not with the effective expiry
    value of the bucket into which the timer was queued.
    
    Storing the requested timer expiry value in base->next_expiry can lead
    to base->clk going backwards if the requested timer expiry value is
    smaller than base->clk. Commit 30c66fc3 ("timer: Prevent base->clk
    from moving backward") worked around this by preventing the store when
    timer->expiry is before base->clk, but did not fix the underlying
    problem.
    
    Use the expiry value of the bucket into which the timer is queued to
    do the new first timer check. This fixes the base->clk going backward
    problem.
    
    The workaround of commit 30c66fc3 ("timer: Prevent base->clk from
    moving backward") in trigger_dyntick_cpu() is not longer necessary as the
    timers bucket expiry is guaranteed to be greater than or equal base->clk.
    Signed-off-by: default avatarAnna-Maria Behnsen <anna-maria@linutronix.de>
    Signed-off-by: default avatarFrederic Weisbecker <frederic@kernel.org>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Link: https://lkml.kernel.org/r/20200717140551.29076-4-frederic@kernel.org
    1f32cab0
timer.c 60.6 KB