• Anna-Maria Gleixner's avatar
    timers: Use deferrable base independent of base::nohz_active · ced6d5c1
    Anna-Maria Gleixner authored
    During boot and before base::nohz_active is set in the timer bases, deferrable
    timers are enqueued into the standard timer base. This works correctly as
    long as base::nohz_active is false.
    
    Once it base::nohz_active is set and a timer which was enqueued before that
    is accessed the lock selector code choses the lock of the deferred
    base. This causes unlocked access to the standard base and in case the
    timer is removed it does not clear the pending flag in the standard base
    bitmap which causes get_next_timer_interrupt() to return bogus values.
    
    To prevent that, the deferrable timers must be enqueued in the deferrable
    base, even when base::nohz_active is not set. Those deferrable timers also
    need to be expired unconditional.
    
    Fixes: 500462a9 ("timers: Switch to a non-cascading wheel")
    Signed-off-by: default avatarAnna-Maria Gleixner <anna-maria@linutronix.de>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Reviewed-by: default avatarFrederic Weisbecker <fweisbec@gmail.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Sebastian Siewior <bigeasy@linutronix.de>
    Cc: stable@vger.kernel.org
    Cc: rt@linutronix.de
    Cc: Paul McKenney <paulmck@linux.vnet.ibm.com>
    Link: https://lkml.kernel.org/r/20171222145337.633328378@linutronix.de
    ced6d5c1
timer.c 56.3 KB