lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [day] [month] [year] [list]
Date:   Fri, 4 Feb 2022 21:20:16 -0800
From:   "Paul E. McKenney" <paulmck@...nel.org>
To:     Hillf Danton <hdanton@...a.com>
Cc:     linux-kernel@...r.kernel.org, rostedt@...dmis.org
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@...nel.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

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ