public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Frederic Weisbecker <frederic@kernel.org>
To: Joel Fernandes <joel@joelfernandes.org>
Cc: linux-kernel@vger.kernel.org,
	Josh Triplett <josh@joshtriplett.org>,
	Lai Jiangshan <jiangshanlai@gmail.com>,
	Mathieu Desnoyers <mathieu.desnoyers@efficios.com>,
	"Paul E. McKenney" <paulmck@kernel.org>,
	rcu@vger.kernel.org, Steven Rostedt <rostedt@goodmis.org>
Subject: Re: [RFC 0/2] srcu: Remove pre-flip memory barrier
Date: Tue, 20 Dec 2022 13:34:43 +0100	[thread overview]
Message-ID: <20221220123443.GA21796@lothringen> (raw)
In-Reply-To: <CAEXW_YRjAsx0HCnmjvth+yi0COTiynPRvjyT2sf1utMw5bTgiw@mail.gmail.com>

On Mon, Dec 19, 2022 at 11:07:17PM -0500, Joel Fernandes wrote:
> On Sun, Dec 18, 2022 at 2:13 PM Joel Fernandes (Google)
> <joel@joelfernandes.org> wrote:
> >
> > Hello, I believe the pre-flip memory barrier is not required. The only reason I
> > can say to remove it, other than the possibility that it is unnecessary, is to
> > not have extra code that does not help. However, since we are issuing a fully
> > memory-barrier after the flip, I cannot say that it hurts to do it anyway.
> >
> > For this reason, please consider these patches as "informational", than a
> > "please merge". :-) Though, feel free to consider merging if you agree!
> >
> > All SRCU scenarios pass with these, with 6 hours of testing.
> >
> > thanks,
> >
> >  - Joel
> >
> > Joel Fernandes (Google) (2):
> > srcu: Remove comment about prior read lock counts
> > srcu: Remove memory barrier "E" as it is not required
> 
> And litmus tests confirm that "E" does not really do what the comments
> say, PTAL:
> Test 1:
> C mbe
> (*
>  * Result: sometimes
>  * Does previous scan see old reader's lock count, if a new reader saw
> the new srcu_idx?
>  *)
> 
> {}
> 
> P0(int *lockcount, int *srcu_idx) // updater
> {
>         int r0;
>         r0 = READ_ONCE(*lockcount);
>         smp_mb();       // E
>         WRITE_ONCE(*srcu_idx, 1);
> }
> 
> P1(int *lockcount, int *srcu_idx) // reader
> {
>         int r0;
>         WRITE_ONCE(*lockcount, 1); // previous reader
>         smp_mb();       // B+C
>         r0 = READ_ONCE(*srcu_idx); // new reader
> }
> exists (0:r0=0 /\ 1:r0=1) (* Bad outcome. *)
> 
> Test 2:
> C mbe2
> 
> (*
>  * Result: sometimes
>  * If updater saw reader's lock count, was that reader using the old idx?
>  *)
> 
> {}
> 
> P0(int *lockcount, int *srcu_idx) // updater
> {
>         int r0;
>         r0 = READ_ONCE(*lockcount);
>         smp_mb();       // E
>         WRITE_ONCE(*srcu_idx, 1);
> }
> 
> P1(int *lockcount, int *srcu_idx) // reader
> {
>         int r0;
>         int r1;
>         r1 = READ_ONCE(*srcu_idx); // previous reader
>         WRITE_ONCE(*lockcount, 1); // previous reader
>         smp_mb();       // B+C
>         r0 = READ_ONCE(*srcu_idx); // new reader
> }
> exists (0:r0=1 /\ 1:r1=1) (* Bad outcome. *)

Actually, starring at this some more, there is some form of dependency
on the idx in order to build the address where the reader must write the
lockcount to. Litmus doesn't support arrays but assuming that
&ssp->sda->srcu_lock_count == 0 (note the & in the beginning), it
could be modelized that way (I'm eluding the unlock part to simplify):

---
C w-depend-r

{
	PLOCK=LOCK0;
}

// updater
P0(int *LOCK0, int *LOCK1, int **PLOCK)
{
	int lock1;

	lock1 = READ_ONCE(*LOCK1); // READ from inactive idx
	smp_mb();
	WRITE_ONCE(*PLOCK, LOCK1); // Flip idx
}

// reader
P1(int **PLOCK)
{
	int *plock;

	plock = READ_ONCE(*PLOCK); 	// Read active idx
	WRITE_ONCE(*plock, 1); // Write to active idx
}

exists (0:lock0=1) // never happens
---

* Is it an address dependency? But the LKMM refers to that only in
  terms of LOAD - LOAD ordering.

* Is it a control dependency? But the LKMM refers to that only in
  terms of branch with "if".

So I don't know the name of the pattern but it makes litmus happy.

Thanks.

  reply	other threads:[~2022-12-20 12:34 UTC|newest]

Thread overview: 73+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-12-18 19:13 [RFC 0/2] srcu: Remove pre-flip memory barrier Joel Fernandes (Google)
2022-12-18 19:13 ` [RFC 1/2] srcu: Remove comment about prior read lock counts Joel Fernandes (Google)
2022-12-18 21:08   ` Mathieu Desnoyers
2022-12-18 21:19     ` Joel Fernandes
2022-12-18 19:13 ` [RFC 2/2] srcu: Remove memory barrier "E" as it is not required Joel Fernandes (Google)
2022-12-18 21:42   ` Frederic Weisbecker
2022-12-18 23:26     ` Joel Fernandes
2022-12-19  0:30       ` Joel Fernandes
2022-12-18 20:57 ` [RFC 0/2] srcu: Remove pre-flip memory barrier Mathieu Desnoyers
2022-12-18 21:30   ` Joel Fernandes
2022-12-18 23:26     ` Paul E. McKenney
2022-12-18 23:38     ` Mathieu Desnoyers
2022-12-19  0:04       ` Joel Fernandes
2022-12-19  0:24         ` Joel Fernandes
2022-12-19  1:50           ` Mathieu Desnoyers
2022-12-20  0:55             ` Joel Fernandes
2022-12-20  1:04               ` Joel Fernandes
2022-12-20 17:00                 ` Mathieu Desnoyers
2022-12-20 18:05                   ` Joel Fernandes
2022-12-20 18:14                     ` Mathieu Desnoyers
2022-12-20 18:29                       ` Joel Fernandes
2022-12-20 19:01                         ` Mathieu Desnoyers
2022-12-20 19:06                           ` Joel Fernandes
2022-12-20 23:05                             ` Frederic Weisbecker
2022-12-20 23:46                               ` Joel Fernandes
2022-12-21  0:27                                 ` Frederic Weisbecker
2022-12-20 22:57                           ` Frederic Weisbecker
2022-12-21  3:34                             ` Mathieu Desnoyers
2022-12-21 11:59                               ` Frederic Weisbecker
2022-12-21 17:11                                 ` Mathieu Desnoyers
2022-12-22 12:40                                   ` Frederic Weisbecker
2022-12-22 13:19                                     ` Joel Fernandes
2022-12-22 16:43                                     ` Paul E. McKenney
2022-12-22 18:19                                       ` Joel Fernandes
2022-12-22 18:53                                         ` Paul E. McKenney
2022-12-22 18:56                                           ` Joel Fernandes
2022-12-22 19:45                                             ` Paul E. McKenney
2022-12-23  4:43                                               ` Joel Fernandes
2022-12-23 16:12                                                 ` Joel Fernandes
2022-12-23 18:15                                                   ` Paul E. McKenney
2022-12-23 20:10                                                     ` Joel Fernandes
2022-12-23 20:52                                                       ` Paul E. McKenney
2022-12-20 20:55                         ` Joel Fernandes
2022-12-21  3:52                           ` Mathieu Desnoyers
2022-12-21  5:02                             ` Joel Fernandes
2022-12-21  0:07                   ` Frederic Weisbecker
2022-12-21  3:47                     ` Mathieu Desnoyers
2022-12-20  4:07 ` Joel Fernandes
2022-12-20 12:34   ` Frederic Weisbecker [this message]
2022-12-20 12:40     ` Frederic Weisbecker
2022-12-20 13:44       ` Joel Fernandes
2022-12-20 14:07         ` Frederic Weisbecker
2022-12-20 14:20           ` Joel Fernandes
2022-12-20 22:44             ` Frederic Weisbecker
2022-12-21  0:15               ` Joel Fernandes
2022-12-21  0:49                 ` Frederic Weisbecker
2022-12-21  0:58                   ` Frederic Weisbecker
2022-12-21  3:43                     ` Mathieu Desnoyers
2022-12-21  4:26                       ` Joel Fernandes
2022-12-21 14:04                         ` Frederic Weisbecker
2022-12-21 16:30                         ` Mathieu Desnoyers
2022-12-21 12:11                       ` Frederic Weisbecker
2022-12-21 17:20                         ` Mathieu Desnoyers
2022-12-21 18:18                           ` Joel Fernandes
2022-12-21  2:41                   ` Joel Fernandes
2022-12-21 11:26                     ` Frederic Weisbecker
2022-12-21 16:02                       ` Boqun Feng
2022-12-21 17:30                         ` Frederic Weisbecker
2022-12-21 19:33                           ` Joel Fernandes
2022-12-21 19:57                             ` Joel Fernandes
2022-12-21 20:19                           ` Boqun Feng
2022-12-22 12:16                             ` Frederic Weisbecker
2022-12-22 12:24                               ` Frederic Weisbecker

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=20221220123443.GA21796@lothringen \
    --to=frederic@kernel.org \
    --cc=jiangshanlai@gmail.com \
    --cc=joel@joelfernandes.org \
    --cc=josh@joshtriplett.org \
    --cc=linux-kernel@vger.kernel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox