All of lore.kernel.org
 help / color / mirror / Atom feed
From: Joel Fernandes <joel@joelfernandes.org>
To: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
Cc: linux-kernel@vger.kernel.org,
	Josh Triplett <josh@joshtriplett.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Mathieu Desnoyers <mathieu.desnoyers@efficios.com>,
	Lai Jiangshan <jiangshanlai@gmail.com>,
	byungchul.park@lge.com, kernel-team@android.com
Subject: Re: [PATCH RFC 1/8] rcu: Add comment documenting how rcu_seq_snap works
Date: Mon, 14 May 2018 18:51:33 -0700	[thread overview]
Message-ID: <20180515015133.GH209519@joelaf.mtv.corp.google.com> (raw)
In-Reply-To: <20180514173816.GA26088@linux.vnet.ibm.com>

On Mon, May 14, 2018 at 10:38:16AM -0700, Paul E. McKenney wrote:
> On Sun, May 13, 2018 at 08:15:34PM -0700, Joel Fernandes (Google) wrote:
> > rcu_seq_snap may be tricky for someone looking at it for the first time.
> > Lets document how it works with an example to make it easier.
> > 
> > Signed-off-by: Joel Fernandes (Google) <joel@joelfernandes.org>
> > ---
> >  kernel/rcu/rcu.h | 24 +++++++++++++++++++++++-
> >  1 file changed, 23 insertions(+), 1 deletion(-)
> > 
> > diff --git a/kernel/rcu/rcu.h b/kernel/rcu/rcu.h
> > index 003671825d62..fc3170914ac7 100644
> > --- a/kernel/rcu/rcu.h
> > +++ b/kernel/rcu/rcu.h
> > @@ -91,7 +91,29 @@ static inline void rcu_seq_end(unsigned long *sp)
> >  	WRITE_ONCE(*sp, rcu_seq_endval(sp));
> >  }
> > 
> > -/* Take a snapshot of the update side's sequence number. */
> > +/*
> > + * Take a snapshot of the update side's sequence number.
> > + *
> > + * This function predicts what the grace period number will be the next
> > + * time an RCU callback will be executed, given the current grace period's
> > + * number. This can be gp+1 if RCU is idle, or gp+2 if a grace period is
> > + * already in progress.
> 
> How about something like this?
> 
> 	This function returns the earliest value of the grace-period
> 	sequence number that will indicate that a full grace period has
> 	elapsed since the current time.  Once the grace-period sequence
> 	number has reached this value, it will be safe to invoke all
> 	callbacks that have been registered prior to the current time.
> 	This value is the current grace-period number plus two to the
> 	power of the number of low-order bits reserved for state, then
> 	rounded up to the next value in which the state bits are all zero.

This makes sense too, but do you disagree with what I said?

I was kind of thinking of snap along the lines of how the previous code
worked. Where you were calling rcu_cbs_completed() or a function with a
similar name. Now we call _snap.

So basically I connected these 2 facts together to mean that rcu_seq_snap
also does that same thing as rcu_cbs_completed - which is basically it gives
the "next GP" where existing callbacks have already run and new callbacks
will run at the end of this "next GP".

> > + *
> > + * We do this with a single addition and masking.
> 
> Please either fold this sentence into rest of the paragraph or add a
> blank line after it.
> 
> > + * For example, if RCU_SEQ_STATE_MASK=1 and the least significant bit (LSB) of
> > + * the seq is used to track if a GP is in progress or not, its sufficient if we
> > + * add (2+1) and mask with ~1. Let's see why with an example:
> > + *
> > + * Say the current seq is 6 which is 0b110 (gp is 3 and state bit is 0).
> > + * To get the next GP number, we have to at least add 0b10 to this (0x1 << 1)
> > + * to account for the state bit. However, if the current seq is 7 (gp is 3 and
> > + * state bit is 1), then it means the current grace period is already in
> > + * progress so the next time the callback will run is at the end of grace
> > + * period number gp+2. To account for the extra +1, we just overflow the LSB by
> > + * adding another 0x1 and masking with ~0x1. In case no GP was in progress (RCU
> > + * is idle), then the addition of the extra 0x1 and masking will have no
> > + * effect. This is calculated as below.
> > + */
> 
> Having the explicit numbers is good, but please use RCU_SEQ_STATE_MASK=3,
> since that is the current value.  One alternative (or perhaps addition)
> is to have a short table of numbers showing the mapping from *sp to the
> return value.  (I started from such a table when writing this function,
> for whatever that is worth.)

Ok I'll try to give a better example above. thanks,

Also just to let you know, thanks so much for elaborately providing an
example on the other thread where we are discussing the rcu_seq_done check. I
will take some time to trace this down and see if I can zero in on the same
understanding as yours.

I get why we use rcu_seq_snap there in rcu_start_this_gp but the way it its
used is 'c' is the requested GP obtained from _snap, and we are comparing that with the existing
rnp->gp_seq in rcu_seq_done.  When that rnp->gp_seq reaches 'c', it only
means rnp->gp_seq is done, it doesn't tell us if 'c' is done which is what
we were trying to check in that loop... that's why I felt that check wasn't
correct - that's my (most likely wrong) take on the matter, and I'll get back
once I trace this a bit more hopefully today :-P

thanks!

- Joel
 

  reply	other threads:[~2018-05-15  1:51 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-05-14  3:15 [PATCH RFC 0/8] rcu fixes, clean ups for rcu/dev Joel Fernandes (Google)
2018-05-14  3:15 ` [PATCH RFC 1/8] rcu: Add comment documenting how rcu_seq_snap works Joel Fernandes (Google)
2018-05-14  3:47   ` Randy Dunlap
2018-05-14  5:05     ` Joel Fernandes
2018-05-14 17:38   ` Paul E. McKenney
2018-05-15  1:51     ` Joel Fernandes [this message]
2018-05-15  3:59       ` Paul E. McKenney
2018-05-15  7:02         ` Joel Fernandes
2018-05-15 12:55           ` Paul E. McKenney
2018-05-15 18:41             ` Joel Fernandes
2018-05-15 19:08               ` Paul E. McKenney
2018-05-15 22:55                 ` Joel Fernandes
2018-05-16 15:45                   ` Paul E. McKenney
2018-05-16 23:21                     ` Joel Fernandes
2018-05-14  3:15 ` [PATCH RFC 2/8] rcu: Clarify usage of cond_resched for tasks-RCU Joel Fernandes (Google)
2018-05-14 14:54   ` Steven Rostedt
2018-05-14 17:22     ` Paul E. McKenney
2018-05-15  0:35       ` Joel Fernandes
2018-05-15  3:42         ` Paul E. McKenney
2018-05-14  3:15 ` [PATCH RFC 3/8] rcu: Add back the cpuend tracepoint Joel Fernandes (Google)
2018-05-14 18:12   ` Paul E. McKenney
2018-05-15  0:43     ` Joel Fernandes
2018-05-14  3:15 ` [PATCH RFC 4/8] rcu: Get rid of old c variable from places in tree RCU Joel Fernandes (Google)
2018-05-14 17:57   ` Paul E. McKenney
2018-05-15  0:41     ` Joel Fernandes
2018-05-14  3:15 ` [PATCH RFC 5/8] rcu: Use rcu_node as temporary variable in funnel locking loop Joel Fernandes (Google)
2018-05-14 18:00   ` Paul E. McKenney
2018-05-15  0:43     ` Joel Fernandes
2018-05-14  3:15 ` [PATCH RFC 6/8] rcu: Add back the Startedleaf tracepoint Joel Fernandes (Google)
2018-05-14 18:38   ` Paul E. McKenney
2018-05-15  0:57     ` Joel Fernandes
2018-05-15  3:46       ` Paul E. McKenney
2018-05-15 23:04         ` Joel Fernandes
2018-05-16 15:48           ` Paul E. McKenney
2018-05-16 23:13             ` Joel Fernandes
2018-05-14  3:15 ` [PATCH RFC 7/8] rcu: trace CleanupMore condition only if needed Joel Fernandes (Google)
2018-05-14 19:20   ` Paul E. McKenney
2018-05-15  1:01     ` Joel Fernandes
2018-05-15  3:47       ` Paul E. McKenney
2018-05-14  3:15 ` [PATCH RFC 8/8] rcu: Fix cpustart tracepoint gp_seq number Joel Fernandes (Google)
2018-05-14 20:33   ` Paul E. McKenney
2018-05-15  1:02     ` Joel Fernandes

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=20180515015133.GH209519@joelaf.mtv.corp.google.com \
    --to=joel@joelfernandes.org \
    --cc=byungchul.park@lge.com \
    --cc=jiangshanlai@gmail.com \
    --cc=josh@joshtriplett.org \
    --cc=kernel-team@android.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mathieu.desnoyers@efficios.com \
    --cc=paulmck@linux.vnet.ibm.com \
    --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.