All of lore.kernel.org
 help / color / mirror / Atom feed
From: Frederic Weisbecker <frederic@kernel.org>
To: "Paul E. McKenney" <paulmck@kernel.org>
Cc: rcu@vger.kernel.org, linux-kernel@vger.kernel.org,
	kernel-team@fb.com, mingo@kernel.org, jiangshanlai@gmail.com,
	akpm@linux-foundation.org, mathieu.desnoyers@efficios.com,
	josh@joshtriplett.org, tglx@linutronix.de, peterz@infradead.org,
	rostedt@goodmis.org, dhowells@redhat.com, edumazet@google.com,
	fweisbec@gmail.com, oleg@redhat.com, joel@joelfernandes.org
Subject: Re: [PATCH tip/core/rcu 1/3] rcu: Provide polling interfaces for Tree RCU grace periods
Date: Fri, 19 Mar 2021 23:10:40 +0100	[thread overview]
Message-ID: <20210319221040.GC814853@lothringen> (raw)
In-Reply-To: <20210319175116.GO2696@paulmck-ThinkPad-P72>

On Fri, Mar 19, 2021 at 10:51:16AM -0700, Paul E. McKenney wrote:
> On Fri, Mar 19, 2021 at 02:58:54PM +0100, Frederic Weisbecker wrote:
> > It's all a matter of personal taste but if I may suggest some namespace
> > modifications:
> > 
> > get_state_synchronize_rcu() -> synchronize_rcu_poll_start_raw()
> > start_poll_synchronize_rcu() -> synchronize_rcu_poll_start()
> > poll_state_synchronize_rcu() -> synchronize_rcu_poll()
> > cond_synchronize_rcu() -> synchronize_rcu_cond()
> > 
> > But it's up to you really.
> 
> I am concerned about starting anything "synchronize_rcu" if that
> thing doesn't unconditionally wait for a grace period.  "What do
> you mean that there was no grace period?  Don't you see that call to
> synchronize_rcu_poll_start_raw()???"

I see, that could indeed be confusing.

> 
> This objection doesn't apply to cond_synchronize_rcu(), but it is
> already in use, so any name change should be worked with the users.
> All two of them.  ;-)

Probably not worth it. We have cond_resched() as a schedule() counterpart
for a reference after all.

> > >  /**
> > > + * start_poll_state_synchronize_rcu - Snapshot and start RCU grace period
> > > + *
> > > + * Returns a cookie that is used by a later call to cond_synchronize_rcu()
> > 
> > It may be worth noting that calling start_poll_synchronize_rcu() and then
> > pass the cookie to cond_synchronize_rcu() soon after may end up waiting for
> > one more grace period.
> 
> You mean this sequence of events?
> 
> 1.	cookie = start_poll_synchronize_rcu()
> 
> 2.	The grace period corresponding to cookie is almost over...
> 
> 3.	cond_synchronize_rcu() checks the cookie and sees that the
> 	grace period has not yet expired.
> 
> 4.	The grace period corresponding to cookie completes.
> 
> 5.	Someone else starts a grace period.
> 
> 6.	cond_synchronize_rcu() invokes synchronize_rcu(), which waits
> 	for the just-started grace period plus another grace period.
> 	Thus, there has been no fewer than three full grace periods
> 	between the call to start_poll_synchronize_rcu() and the
> 	return from cond_synchronize_rcu().
> 
> Yes, this can happen!  And it can be worse, for example, it is quite
> possible that cond_synchronize_rcu() would be preempted for multiple
> grace periods at step 5, in which case it would still wait for almost
> two additional grace periods.
> 
> Or are you thinking of something else?

I didn't even think that far.
My scenario was:

1.	cookie = start_poll_synchronize_rcu()
 
 
2.	cond_synchronize_rcu() checks the cookie and sees that the
	grace period has not yet expired. So it calls synchronize_rcu()
	which queues a callback.

3.	The grace period for the cookie eventually completes.

4.	The callback queued in 2. gets assigned a new grace period number.
	That new grace period starts.

5.	The new grace period completes and synchronize_rcu() returns.


But I think this is due to some deep misunderstanding from my end.


> > > + * If a full RCU grace period has elapsed since the earlier call from
> > > + * which oldstate was obtained, return @true, otherwise return @false.
> > > + * Otherwise, invoke synchronize_rcu() to wait for a full grace period.
> > 
> > Rephrase suggestion for the last sentence:
> > 
> > "In case of failure, it's up to the caller to try polling again later or
> > invoke synchronize_rcu() to wait for a new full grace period to complete."
> 
> How about like this?
> 
> /**
>  * poll_state_synchronize_rcu - Conditionally wait for an RCU grace period
>  *
>  * @oldstate: return from call to get_state_synchronize_rcu() or start_poll_synchronize_rcu()
>  *
>  * If a full RCU grace period has elapsed since the earlier call from
>  * which oldstate was obtained, return @true, otherwise return @false.
>  * If @false is returned, it is the caller's responsibilty to invoke this
>  * function later on until it does return @true.  Alternatively, the caller
>  * can explicitly wait for a grace period, for example, by passing @oldstate
>  * to cond_synchronize_rcu() or by directly invoking synchronize_rcu().

Yes very nice!

Thanks!

  reply	other threads:[~2021-03-19 22:11 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-04  0:26 [PATCH tip/core/rcu 0/3] Polling RCU grace-period interfaces for v5.13 Paul E. McKenney
2021-03-04  0:26 ` [PATCH tip/core/rcu 1/3] rcu: Provide polling interfaces for Tree RCU grace periods paulmck
2021-03-12 12:21   ` Frederic Weisbecker
2021-03-12 12:26   ` Frederic Weisbecker
2021-03-15 23:11     ` Paul E. McKenney
2021-03-16 14:47   ` Frederic Weisbecker
2021-03-16 16:42     ` Paul E. McKenney
2021-03-16 15:17   ` Frederic Weisbecker
2021-03-16 16:51     ` Paul E. McKenney
2021-03-18 14:59       ` Frederic Weisbecker
2021-03-18 17:09         ` Paul E. McKenney
2021-03-19 13:58   ` Frederic Weisbecker
2021-03-19 17:51     ` Paul E. McKenney
2021-03-19 22:10       ` Frederic Weisbecker [this message]
2021-03-19 23:38         ` Paul E. McKenney
2021-03-19 23:47           ` Frederic Weisbecker
2021-03-04  0:26 ` [PATCH tip/core/rcu 2/3] rcu: Provide polling interfaces for Tiny " paulmck
2021-03-21 22:28   ` Frederic Weisbecker
2021-03-22 15:47     ` Paul E. McKenney
2021-03-22 19:00       ` Frederic Weisbecker
2021-03-22 19:45         ` Paul E. McKenney
2021-03-23 14:02           ` Frederic Weisbecker
2021-03-23 16:45             ` Paul E. McKenney
2021-03-04  0:26 ` [PATCH tip/core/rcu 3/3] rcutorture: Test start_poll_synchronize_rcu() and poll_state_synchronize_rcu() paulmck

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=20210319221040.GC814853@lothringen \
    --to=frederic@kernel.org \
    --cc=akpm@linux-foundation.org \
    --cc=dhowells@redhat.com \
    --cc=edumazet@google.com \
    --cc=fweisbec@gmail.com \
    --cc=jiangshanlai@gmail.com \
    --cc=joel@joelfernandes.org \
    --cc=josh@joshtriplett.org \
    --cc=kernel-team@fb.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mathieu.desnoyers@efficios.com \
    --cc=mingo@kernel.org \
    --cc=oleg@redhat.com \
    --cc=paulmck@kernel.org \
    --cc=peterz@infradead.org \
    --cc=rcu@vger.kernel.org \
    --cc=rostedt@goodmis.org \
    --cc=tglx@linutronix.de \
    /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.