rcu: Add comments to final rcu_gp_cleanup() "if" statement
The final "if" statement in rcu_gp_cleanup() has proven to be rather confusing, straightforward though it might have seemed when initially written. This commit therefore adds comments to its "then" and "else" clauses to at least provide a more elevated form of confusion. Reported-by: Boqun Feng <boqun.feng@gmail.com> Reported-by: Frederic Weisbecker <frederic@kernel.org> Reported-by: Neeraj Upadhyay <quic_neeraju@quicinc.com> Reported-by: Uladzislau Rezki <urezki@gmail.com> Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
This commit is contained in:
parent
3791a22374
commit
75182a4eaa
|
@ -2098,14 +2098,29 @@ static noinline void rcu_gp_cleanup(void)
|
|||
/* Advance CBs to reduce false positives below. */
|
||||
offloaded = rcu_rdp_is_offloaded(rdp);
|
||||
if ((offloaded || !rcu_accelerate_cbs(rnp, rdp)) && needgp) {
|
||||
|
||||
// We get here if a grace period was needed (“needgp”)
|
||||
// and the above call to rcu_accelerate_cbs() did not set
|
||||
// the RCU_GP_FLAG_INIT bit in ->gp_state (which records
|
||||
// the need for another grace period). The purpose
|
||||
// of the “offloaded” check is to avoid invoking
|
||||
// rcu_accelerate_cbs() on an offloaded CPU because we do not
|
||||
// hold the ->nocb_lock needed to safely access an offloaded
|
||||
// ->cblist. We do not want to acquire that lock because
|
||||
// it can be heavily contended during callback floods.
|
||||
|
||||
WRITE_ONCE(rcu_state.gp_flags, RCU_GP_FLAG_INIT);
|
||||
WRITE_ONCE(rcu_state.gp_req_activity, jiffies);
|
||||
trace_rcu_grace_period(rcu_state.name,
|
||||
rcu_state.gp_seq,
|
||||
TPS("newreq"));
|
||||
trace_rcu_grace_period(rcu_state.name, rcu_state.gp_seq, TPS("newreq"));
|
||||
} else {
|
||||
WRITE_ONCE(rcu_state.gp_flags,
|
||||
rcu_state.gp_flags & RCU_GP_FLAG_INIT);
|
||||
|
||||
// We get here either if there is no need for an
|
||||
// additional grace period or if rcu_accelerate_cbs() has
|
||||
// already set the RCU_GP_FLAG_INIT bit in ->gp_flags.
|
||||
// So all we need to do is to clear all of the other
|
||||
// ->gp_flags bits.
|
||||
|
||||
WRITE_ONCE(rcu_state.gp_flags, rcu_state.gp_flags & RCU_GP_FLAG_INIT);
|
||||
}
|
||||
raw_spin_unlock_irq_rcu_node(rnp);
|
||||
|
||||
|
|
Loading…
Reference in New Issue