]> git.baikalelectronics.ru Git - kernel.git/commit
timers: Use deferrable base independent of base::nohz_active
authorAnna-Maria Gleixner <anna-maria@linutronix.de>
Fri, 22 Dec 2017 14:51:12 +0000 (15:51 +0100)
committerThomas Gleixner <tglx@linutronix.de>
Fri, 29 Dec 2017 22:13:09 +0000 (23:13 +0100)
commit8f9d64932ea03696d46d82d743c038bdbcb26159
tree49657d66f4200eac62ace044a82bf94656c1e3d3
parent18e139edd976b836a4f8604211b816deb7c902c0
timers: Use deferrable base independent of base::nohz_active

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: 2f85a02e9a63 ("timers: Switch to a non-cascading wheel")
Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Frederic 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
kernel/time/timer.c