rcu: Remove duplicate RCU exp QS report from rcu_report_dead()
authorZqiang <qiang1.zhang@intel.com>
Tue, 30 Aug 2022 08:31:51 +0000 (16:31 +0800)
committerPaul E. McKenney <paulmck@kernel.org>
Tue, 18 Oct 2022 21:59:57 +0000 (14:59 -0700)
commitd6fd907a95a73251bd8494e1ba5350342e05e74a
tree31c0c7b43ebb8f00aee677db7fcb36fff1bb21ec
parent9abf2313adc1ca1b6180c508c25f22f9395cc780
rcu: Remove duplicate RCU exp QS report from rcu_report_dead()

The rcu_report_dead() function invokes rcu_report_exp_rdp() in order
to force an immediate expedited quiescent state on the outgoing
CPU, and then it invokes rcu_preempt_deferred_qs() to provide any
required deferred quiescent state of either sort.  Because the call to
rcu_preempt_deferred_qs() provides the expedited RCU quiescent state if
requested, the call to rcu_report_exp_rdp() is potentially redundant.

One possible issue is a concurrent start of a new expedited RCU
grace period, but this situation is already handled correctly
by __sync_rcu_exp_select_node_cpus().  This function will detect
that the CPU is going offline via the error return from its call
to smp_call_function_single().  In that case, it will retry, and
eventually stop retrying due to rcu_report_exp_rdp() clearing the
->qsmaskinitnext bit corresponding to the target CPU.  As a result,
__sync_rcu_exp_select_node_cpus() will report the necessary quiescent
state after dealing with any remaining CPU.

This change assumes that control does not enter rcu_report_dead() within
an RCU read-side critical section, but then again, the surviving call
to rcu_preempt_deferred_qs() has always made this assumption.

This commit therefore removes the call to rcu_report_exp_rdp(), thus
relying on rcu_preempt_deferred_qs() to handle both normal and expedited
quiescent states.

Signed-off-by: Zqiang <qiang1.zhang@intel.com>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
kernel/rcu/tree.c