• Thomas Gleixner's avatar
    timers: Lock base for same bucket optimization · 4da9152a
    Thomas Gleixner authored
    Linus stumbled over the unlocked modification of the timer expiry value in
    mod_timer() which is an optimization for timers which stay in the same
    bucket - due to the bucket granularity - despite their expiry time getting
    updated.
    
    The optimization itself still makes sense even if we take the lock, because
    in case that the bucket stays the same, we avoid the pointless
    queue/enqueue dance.
    
    Make the check and the modification of timer->expires protected by the base
    lock and shuffle the remaining code around so we can keep the lock held
    when we actually have to requeue the timer to a different bucket.
    
    Fixes: f00c0afd ("timers: Implement optimization for same expiry time in mod_timer()")
    Reported-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Link: http://lkml.kernel.org/r/alpine.DEB.2.20.1610241711220.4983@nanos
    Cc: stable@vger.kernel.org
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    4da9152a
timer.c 54.7 KB