srcu: Explain srcu_funnel_gp_start() call to list_add() is safe
authorPaul E. McKenney <paulmck@kernel.org>
Thu, 27 Jan 2022 21:47:42 +0000 (13:47 -0800)
committerPaul E. McKenney <paulmck@kernel.org>
Mon, 11 Apr 2022 22:52:30 +0000 (15:52 -0700)
This commit adds a comment explaining why an unprotected call to
list_add() from srcu_funnel_gp_start() can be safe.  TL;DR: It is only
called during very early boot when we don't have no steeking concurrency!

Co-developed-by: Neeraj Upadhyay <quic_neeraju@quicinc.com>
Signed-off-by: Neeraj Upadhyay <quic_neeraju@quicinc.com>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
kernel/rcu/srcutree.c

index 7209fd95dde9e7c835f39de8d429571a95926176..64993a172cfff547f1e646bba848720690f1ca1c 100644 (file)
@@ -776,6 +776,12 @@ static void srcu_funnel_gp_start(struct srcu_struct *ssp, struct srcu_data *sdp,
            rcu_seq_state(ssp->srcu_gp_seq) == SRCU_STATE_IDLE) {
                WARN_ON_ONCE(ULONG_CMP_GE(ssp->srcu_gp_seq, ssp->srcu_gp_seq_needed));
                srcu_gp_start(ssp);
+
+               // And how can that list_add() in the "else" clause
+               // possibly be safe for concurrent execution?  Well,
+               // it isn't.  And it does not have to be.  After all, it
+               // can only be executed during early boot when there is only
+               // the one boot CPU running with interrupts still disabled.
                if (likely(srcu_init_done))
                        queue_delayed_work(rcu_gp_wq, &ssp->work,
                                           srcu_get_delay(ssp));