Messages in this thread | | | Date | Fri, 4 Feb 2022 21:20:16 -0800 | From | "Paul E. McKenney" <> | Subject | Re: [PATCH rcu 19/19] srcu: Add contention check to call_srcu() srcu_data ->lock acquisition |
| |
On Sat, Feb 05, 2022 at 11:03:03AM +0800, Hillf Danton wrote: > On Fri, 4 Feb 2022 15:39:02 -0800 > > This commit increases the sensitivity of contention detection by adding > > checks to the acquisition of the srcu_data structure's lock on the > > call_srcu() code path. > > > > Signed-off-by: Paul E. McKenney <paulmck@kernel.org> > > --- > > kernel/rcu/srcutree.c | 45 ++++++++++++++++++++++++++++++++++--------- > > 1 file changed, 36 insertions(+), 9 deletions(-) > > > > diff --git a/kernel/rcu/srcutree.c b/kernel/rcu/srcutree.c > > index c3968e091d019..31a7a9e2445da 100644 > > --- a/kernel/rcu/srcutree.c > > +++ b/kernel/rcu/srcutree.c > > @@ -320,18 +320,13 @@ static void srcu_transition_to_big(struct srcu_struct *ssp) > > } > > > > /* > > - * Acquire the specified srcu_struct structure's ->lock, but check for > > - * excessive contention, which results in initiation of a transition > > - * to SRCU_SIZE_BIG. But only if the srcutree.convert_to_big module > > - * parameter permits this. > > + * Check to see if the just-encountered contention event justifies > > + * a transition to SRCU_SIZE_BIG. > > */ > > -static void spin_lock_irqsave_ssp_contention(struct srcu_struct *ssp, unsigned long *flags) > > +static void spin_lock_irqsave_check_contention(struct srcu_struct *ssp) > > { > > unsigned long j; > > > > - if (spin_trylock_irqsave_rcu_node(ssp, *flags)) > > - return; > > - spin_lock_irqsave_rcu_node(ssp, *flags); > > Given neither try/lock nor irqsave any longer, a new function name is > prefered.
This function contains the contention-checking common code for the spin_lock_irqsave_ssp_contention() and spin_lock_irqsave_sdp_contention() functions, so the current name is fine.
Thanx, Paul
> Hillf > > > if (!SRCU_SIZING_IS_CONTEND() || ssp->srcu_size_state) > > return; > > j = jiffies; > > @@ -344,6 +339,38 @@ static void spin_lock_irqsave_ssp_contention(struct srcu_struct *ssp, unsigned l > > __srcu_transition_to_big(ssp); > > } > > > > +/* > > + * Acquire the specified srcu_data structure's ->lock, but check for > > + * excessive contention, which results in initiation of a transition > > + * to SRCU_SIZE_BIG. But only if the srcutree.convert_to_big module > > + * parameter permits this. > > + */ > > +static void spin_lock_irqsave_sdp_contention(struct srcu_data *sdp, unsigned long *flags) > > +{ > > + struct srcu_struct *ssp = sdp->ssp; > > + > > + if (spin_trylock_irqsave_rcu_node(sdp, *flags)) > > + return; > > + spin_lock_irqsave_rcu_node(ssp, *flags); > > + spin_lock_irqsave_check_contention(ssp); > > + spin_unlock_irqrestore_rcu_node(ssp, *flags); > > + spin_lock_irqsave_rcu_node(sdp, *flags); > > +} > > + > > +/* > > + * Acquire the specified srcu_struct structure's ->lock, but check for > > + * excessive contention, which results in initiation of a transition > > + * to SRCU_SIZE_BIG. But only if the srcutree.convert_to_big module > > + * parameter permits this. > > + */ > > +static void spin_lock_irqsave_ssp_contention(struct srcu_struct *ssp, unsigned long *flags) > > +{ > > + if (spin_trylock_irqsave_rcu_node(ssp, *flags)) > > + return; > > + spin_lock_irqsave_rcu_node(ssp, *flags); > > + spin_lock_irqsave_check_contention(ssp); > > +} > > + > > /* > > * First-use initialization of statically allocated srcu_struct > > * structure. Wiring up the combining tree is more than can be > > @@ -989,7 +1016,7 @@ static unsigned long srcu_gp_start_if_needed(struct srcu_struct *ssp, > > } else { > > sdp = raw_cpu_ptr(ssp->sda); > > } > > - spin_lock_irqsave_rcu_node(sdp, flags); > > + spin_lock_irqsave_sdp_contention(sdp, &flags); > > if (rhp) > > rcu_segcblist_enqueue(&sdp->srcu_cblist, rhp); > > rcu_segcblist_advance(&sdp->srcu_cblist, > > -- > > 2.31.1.189.g2e36527f23
| |