rcu: Stop treating in-kernel CPU-bound workloads as errors
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Fri, 11 Dec 2015 21:48:43 +0000 (13:48 -0800)
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Wed, 24 Feb 2016 03:59:51 +0000 (19:59 -0800)
commit4914950aaa12de8a2004b8031b45480526caf42b
tree9675c74cb3de70f93da8ed9b6648c0550e37f135
parent8994515cf0030e5020d67bb837a9d9a92441d0f7
rcu: Stop treating in-kernel CPU-bound workloads as errors

Commit 4a81e8328d379 ("Reduce overhead of cond_resched() checks for RCU")
handles the error case where a nohz_full loops indefinitely in the kernel
with the scheduling-clock interrupt disabled.  However, this handling
includes IPIing the CPU running the offending loop, which is not what
we want for real-time workloads.  And there are starting to be real-time
CPU-bound in-kernel workloads, and these must be handled without IPIing
the CPU, at least not in the common case.  Therefore, this situation can
no longer be dismissed as an error case.

This commit therefore splits the handling out, so that the setting of
bits in the per-CPU rcu_sched_qs_mask variable is done relatively early,
but if the problem persists, resched_cpu() is eventually used to IPI the
CPU containing the offending loop.  Assuming that in-kernel CPU-bound
loops used by real-time tasks contain frequent calls cond_resched_rcu_qs()
(as in more than once per few tens of milliseconds), the real-time tasks
will never be IPIed.

Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
kernel/rcu/tree.c