All of lore.kernel.org
 help / color / mirror / Atom feed
From: Pingfan Liu <kernelfans@gmail.com>
To: "Paul E. McKenney" <paulmck@kernel.org>
Cc: rcu@vger.kernel.org, Lai Jiangshan <jiangshanlai@gmail.com>,
	Frederic Weisbecker <frederic@kernel.org>,
	Josh Triplett <josh@joshtriplett.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Subject: Re: [PATCH 1/2] srcu: Remove needless rcu_seq_done() check while holding read lock
Date: Tue, 22 Nov 2022 17:50:26 +0800	[thread overview]
Message-ID: <Y3ybYubzvbmBFeah@piliu.users.ipa.redhat.com> (raw)
In-Reply-To: <20221122011345.GS4001@paulmck-ThinkPad-P17-Gen-1>

On Mon, Nov 21, 2022 at 05:13:45PM -0800, Paul E. McKenney wrote:
> On Sun, Nov 20, 2022 at 11:40:13AM +0800, Pingfan Liu wrote:
> > As the code changes, now, srcu_gp_start_if_needed() holds the srcu read
> > lock, gets the gp_seq snap and call srcu_funnel_gp_start() passing that
> > snap value.
> > 
> > As the rcu_seq_snap() promises "a full grace period has elapsed since
> > the current time".  In srcu_funnel_gp_start(), the statement
> >   rcu_seq_done(&ssp->srcu_gp_seq, s)
> > always return false.
> > 
> > The same condition stands for srcu_funnel_exp_start(). Hence removing
> > all the checks of rcu_seq_done().
> > 
> > Test info:
> >   Running "tools/testing/selftests/rcutorture/bin/kvm.sh --allcpus --duration 10h --configs 18*SRCU-P"
> > without any failure.
> 
> Nice catch!!!  And I do appreciate the testing.
> 
> But if we are going to do this, let's please also place lockdep assertions
> in srcu_funnel_exp_start() and srcu_funnel_gp_start() to verify that these
> functions are in fact invoked within an SRCU read-side critical section.
> Also a WARN_ON_ONCE(rcu_seq_done(&ssp->srcu_gp_seq, s)), please.
> 

OK, I will do both.

> Things changed to make the rcu_seq_done() unnecessary, so they could just
> as easily change again.
> 

Yes. It is wise to prevent from the future variation.

Thanks,

	Pingfan

> 							Thanx, Paul
> 
> > Signed-off-by: Pingfan Liu <kernelfans@gmail.com>
> > Cc: Lai Jiangshan <jiangshanlai@gmail.com>
> > Cc: "Paul E. McKenney" <paulmck@kernel.org>
> > Cc: Frederic Weisbecker <frederic@kernel.org>
> > Cc: Josh Triplett <josh@joshtriplett.org>
> > Cc: Steven Rostedt <rostedt@goodmis.org>
> > Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
> > To: rcu@vger.kernel.org
> > ---
> >  kernel/rcu/srcutree.c | 13 ++++++-------
> >  1 file changed, 6 insertions(+), 7 deletions(-)
> > 
> > diff --git a/kernel/rcu/srcutree.c b/kernel/rcu/srcutree.c
> > index 1c304fec89c0..7df59fc8073e 100644
> > --- a/kernel/rcu/srcutree.c
> > +++ b/kernel/rcu/srcutree.c
> > @@ -851,8 +851,7 @@ static void srcu_funnel_exp_start(struct srcu_struct *ssp, struct srcu_node *snp
> >  	if (snp)
> >  		for (; snp != NULL; snp = snp->srcu_parent) {
> >  			sgsne = READ_ONCE(snp->srcu_gp_seq_needed_exp);
> > -			if (rcu_seq_done(&ssp->srcu_gp_seq, s) ||
> > -			    (!srcu_invl_snp_seq(sgsne) && ULONG_CMP_GE(sgsne, s)))
> > +			if (!srcu_invl_snp_seq(sgsne) && ULONG_CMP_GE(sgsne, s))
> >  				return;
> >  			spin_lock_irqsave_rcu_node(snp, flags);
> >  			sgsne = snp->srcu_gp_seq_needed_exp;
> > @@ -878,6 +877,9 @@ static void srcu_funnel_exp_start(struct srcu_struct *ssp, struct srcu_node *snp
> >   *
> >   * Note that this function also does the work of srcu_funnel_exp_start(),
> >   * in some cases by directly invoking it.
> > + *
> > + * The srcu read lock should be hold around this function. And s is a seq snap
> > + * after holding that lock.
> >   */
> >  static void srcu_funnel_gp_start(struct srcu_struct *ssp, struct srcu_data *sdp,
> >  				 unsigned long s, bool do_norm)
> > @@ -898,8 +900,6 @@ static void srcu_funnel_gp_start(struct srcu_struct *ssp, struct srcu_data *sdp,
> >  	if (snp_leaf)
> >  		/* Each pass through the loop does one level of the srcu_node tree. */
> >  		for (snp = snp_leaf; snp != NULL; snp = snp->srcu_parent) {
> > -			if (rcu_seq_done(&ssp->srcu_gp_seq, s) && snp != snp_leaf)
> > -				return; /* GP already done and CBs recorded. */
> >  			spin_lock_irqsave_rcu_node(snp, flags);
> >  			snp_seq = snp->srcu_have_cbs[idx];
> >  			if (!srcu_invl_snp_seq(snp_seq) && ULONG_CMP_GE(snp_seq, s)) {
> > @@ -935,9 +935,8 @@ static void srcu_funnel_gp_start(struct srcu_struct *ssp, struct srcu_data *sdp,
> >  	if (!do_norm && ULONG_CMP_LT(ssp->srcu_gp_seq_needed_exp, s))
> >  		WRITE_ONCE(ssp->srcu_gp_seq_needed_exp, s);
> >  
> > -	/* If grace period not already done and none in progress, start it. */
> > -	if (!rcu_seq_done(&ssp->srcu_gp_seq, s) &&
> > -	    rcu_seq_state(ssp->srcu_gp_seq) == SRCU_STATE_IDLE) {
> > +	/* If grace period not already in progress, start it. */
> > +	if (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);
> >  
> > -- 
> > 2.31.1
> > 

  reply	other threads:[~2022-11-22  9:50 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-11-20  3:40 [PATCH 0/2] srcu: Optimize when srcu_gp_start_if_needed() holds Pingfan Liu
2022-11-20  3:40 ` [PATCH 1/2] srcu: Remove needless rcu_seq_done() check while holding read lock Pingfan Liu
2022-11-20  5:00   ` Zhang, Qiang1
2022-11-20 15:26     ` Pingfan Liu
2022-11-22  1:13   ` Paul E. McKenney
2022-11-22  9:50     ` Pingfan Liu [this message]
2022-11-20  3:40 ` [PATCH 2/2] srcu: Remove needless updating of srcu_have_cbs in srcu_gp_end() Pingfan Liu
2022-11-22  1:19   ` Paul E. McKenney
2022-11-22  9:59     ` Pingfan Liu
2022-11-22 14:45       ` Paul E. McKenney
2022-11-23 13:29         ` Pingfan Liu
2022-11-23 18:40           ` Paul E. McKenney
2022-11-20 15:20 ` [PATCH] srcu: Eliminate the case that snp_seq bigger than snap in srcu_funnel_gp_start() Pingfan Liu
2022-11-20 15:23   ` Pingfan Liu
2022-11-22  1:20     ` Paul E. McKenney

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Y3ybYubzvbmBFeah@piliu.users.ipa.redhat.com \
    --to=kernelfans@gmail.com \
    --cc=frederic@kernel.org \
    --cc=jiangshanlai@gmail.com \
    --cc=josh@joshtriplett.org \
    --cc=mathieu.desnoyers@efficios.com \
    --cc=paulmck@kernel.org \
    --cc=rcu@vger.kernel.org \
    --cc=rostedt@goodmis.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.