]> git.baikalelectronics.ru Git - kernel.git/commit
rcu: Ensure that RCU_FAST_NO_HZ timers expire on correct CPU
authorPaul E. McKenney <paul.mckenney@linaro.org>
Thu, 15 Mar 2012 19:16:26 +0000 (12:16 -0700)
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Tue, 1 May 2012 15:22:50 +0000 (08:22 -0700)
commitd6a0fd0e1fe8d6fe1946989ece69765c2292c656
treedb1395c5d33da33c8ea6c82f6e5b7346cc5beb91
parent9187d77eb8a437f803003c941b1a7e78855ab5bf
rcu: Ensure that RCU_FAST_NO_HZ timers expire on correct CPU

Timers are subject to migration, which can lead to the following
system-hang scenario when CONFIG_RCU_FAST_NO_HZ=y:

1. CPU 0 executes synchronize_rcu(), which posts an RCU callback.

2. CPU 0 then goes idle.  It cannot immediately invoke the callback,
but there is nothing RCU needs from ti, so it enters dyntick-idle
mode after posting a timer.

3. The timer gets migrated to CPU 1.

4. CPU 0 never wakes up, so the synchronize_rcu() never returns, so
the system hangs.

This commit fixes this problem by using mod_timer_pinned(), as suggested
by Peter Zijlstra, to ensure that the timer is actually posted on the
running CPU.

Reported-by: Dipankar Sarma <dipankar@in.ibm.com>
Signed-off-by: Paul E. McKenney <paul.mckenney@linaro.org>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
kernel/rcutree_plugin.h