rcu-tasks: Make ksoftirqd provide RCU Tasks quiescent states
authorPaul E. McKenney <paulmck@kernel.org>
Thu, 25 Mar 2021 00:08:48 +0000 (17:08 -0700)
committerPaul E. McKenney <paulmck@kernel.org>
Tue, 18 May 2021 17:54:51 +0000 (10:54 -0700)
Heavy networking load can cause a CPU to execute continuously and
indefinitely within ksoftirqd, in which case there will be no voluntary
task switches and thus no RCU-tasks quiescent states.  This commit
therefore causes the exiting rcu_softirq_qs() to provide an RCU-tasks
quiescent state.

This of course means that __do_softirq() and its callers cannot be
invoked from within a tracing trampoline.

Reported-by: Toke Høiland-Jørgensen <toke@redhat.com>
Tested-by: Toke Høiland-Jørgensen <toke@redhat.com>
Reviewed-by: Masami Hiramatsu <mhiramat@kernel.org>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
kernel/rcu/tree.c

index 8e78b24..f4daa4e 100644 (file)
@@ -242,6 +242,7 @@ void rcu_softirq_qs(void)
 {
        rcu_qs();
        rcu_preempt_deferred_qs(current);
+       rcu_tasks_qs(current, false);
 }
 
 /*