rcu: Do not report strict GPs for outgoing CPUs
authorPaul E. McKenney <paulmck@kernel.org>
Fri, 30 Oct 2020 20:11:24 +0000 (13:11 -0700)
committerPaul E. McKenney <paulmck@kernel.org>
Fri, 20 Nov 2020 03:37:17 +0000 (19:37 -0800)
commitbfb3aa735f82c8d98b32a669934ee7d6b346264d
tree3192bd1a1cc4a381e5bcac13e0a72f31df4ce061
parent354c3f0e22dcb17c10d0b79f6e1c5ba286eec0b0
rcu: Do not report strict GPs for outgoing CPUs

An outgoing CPU is marked offline in a stop-machine handler and most
of that CPU's services stop at that point, including IRQ work queues.
However, that CPU must take another pass through the scheduler and through
a number of CPU-hotplug notifiers, many of which contain RCU readers.
In the past, these readers were not a problem because the outgoing CPU
has interrupts disabled, so that rcu_read_unlock_special() would not
be invoked, and thus RCU would never attempt to queue IRQ work on the
outgoing CPU.

This changed with the advent of the CONFIG_RCU_STRICT_GRACE_PERIOD
Kconfig option, in which rcu_read_unlock_special() is invoked upon exit
from almost all RCU read-side critical sections.  Worse yet, because
interrupts are disabled, rcu_read_unlock_special() cannot immediately
report a quiescent state and will therefore attempt to defer this
reporting, for example, by queueing IRQ work.  Which fails with a splat
because the CPU is already marked as being offline.

But it turns out that there is no need to report this quiescent state
because rcu_report_dead() will do this job shortly after the outgoing
CPU makes its final dive into the idle loop.  This commit therefore
makes rcu_read_unlock_special() refrain from queuing IRQ work onto
outgoing CPUs.

Fixes: 44bad5b3cca2 ("rcu: Do full report for .need_qs for strict GPs")
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Cc: Jann Horn <jannh@google.com>
kernel/rcu/tree_plugin.h