The following commit has been merged into the core/rcu branch of tip: Commit-ID: 9c39245382de4d52a122641952900709d4a9950b Gitweb: https://git.kernel.org/tip/9c39245382de4d52a122641952900709d4a9950b Author: Neeraj Upadhyay <neer...@codeaurora.org> AuthorDate: Mon, 22 Jun 2020 00:07:27 +05:30 Committer: Paul E. McKenney <paul...@kernel.org> CommitterDate: Mon, 24 Aug 2020 18:36:05 -07:00
rcu/tree: Force quiescent state on callback overload On callback overload, it is necessary to quickly detect idle CPUs, and rcu_gp_fqs_check_wake() checks for this condition. Unfortunately, the code following the call to this function does not repeat this check, which means that in reality no actual quiescent-state forcing, instead only a couple of quick and pointless wakeups at the beginning of the grace period. This commit therefore adds a check for the RCU_GP_FLAG_OVLD flag in the post-wakeup "if" statement in rcu_gp_fqs_loop(). Fixes: 1fca4d12f4637 ("rcu: Expedite first two FQS scans under callback-overload conditions") Reviewed-by: Joel Fernandes (Google) <j...@joelfernandes.org> Signed-off-by: Neeraj Upadhyay <neer...@codeaurora.org> Signed-off-by: Paul E. McKenney <paul...@kernel.org> --- kernel/rcu/tree.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c index 8969120..4770d77 100644 --- a/kernel/rcu/tree.c +++ b/kernel/rcu/tree.c @@ -1884,7 +1884,7 @@ static void rcu_gp_fqs_loop(void) break; /* If time for quiescent-state forcing, do it. */ if (!time_after(rcu_state.jiffies_force_qs, jiffies) || - (gf & RCU_GP_FLAG_FQS)) { + (gf & (RCU_GP_FLAG_FQS | RCU_GP_FLAG_OVLD))) { trace_rcu_grace_period(rcu_state.name, rcu_state.gp_seq, TPS("fqsstart")); rcu_gp_fqs(first_gp_fqs);