All of lore.kernel.org
 help / color / mirror / Atom feed
From: Boqun Feng <boqun.feng@gmail.com>
To: Daniel Lustig <dlustig@nvidia.com>
Cc: Palmer Dabbelt <palmer@dabbelt.com>,
	"will.deacon@arm.com" <will.deacon@arm.com>,
	Arnd Bergmann <arnd@arndb.de>, Olof Johansson <olof@lixom.net>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"patches@groups.riscv.org" <patches@groups.riscv.org>,
	"peterz@infradead.org" <peterz@infradead.org>
Subject: Re: [patches] Re: [PATCH v9 05/12] RISC-V: Atomic and Locking Code
Date: Thu, 16 Nov 2017 09:52:12 +0800	[thread overview]
Message-ID: <20171116015212.GF6280@tardis> (raw)
In-Reply-To: <7af820e0b90848dbac4d3120758b1cf6@HQMAIL105.nvidia.com>

[-- Attachment #1: Type: text/plain, Size: 5295 bytes --]

On Thu, Nov 16, 2017 at 01:31:21AM +0000, Daniel Lustig wrote:
> > -----Original Message-----
> > From: Boqun Feng [mailto:boqun.feng@gmail.com]
> > Sent: Wednesday, November 15, 2017 5:19 PM
> > To: Daniel Lustig <dlustig@nvidia.com>
> > Cc: Palmer Dabbelt <palmer@dabbelt.com>; will.deacon@arm.com; Arnd
> > Bergmann <arnd@arndb.de>; Olof Johansson <olof@lixom.net>; linux-
> > kernel@vger.kernel.org; patches@groups.riscv.org; peterz@infradead.org
> > Subject: Re: [patches] Re: [PATCH v9 05/12] RISC-V: Atomic and Locking Code
> > 
> > On Wed, Nov 15, 2017 at 11:59:44PM +0000, Daniel Lustig wrote:
> > > > On Wed, 15 Nov 2017 10:06:01 PST (-0800), will.deacon@arm.com wrote:
> > > >> On Tue, Nov 14, 2017 at 12:30:59PM -0800, Palmer Dabbelt wrote:
> > > >> > On Tue, 24 Oct 2017 07:10:33 PDT (-0700), will.deacon@arm.com
> > wrote:
> > > >> >>On Tue, Sep 26, 2017 at 06:56:31PM -0700, Palmer Dabbelt wrote:
> > > > >
> > > > > Hi Palmer,
> > > > >
> > > > >> >>+ATOMIC_OPS(add, add, +,  i,      , _relaxed)
> > > > >> >>+ATOMIC_OPS(add, add, +,  i, .aq  , _acquire) ATOMIC_OPS(add,
> > > > >> >>+add,
> > > > >> >>++,  i, .rl  , _release)
> > > > >> >>+ATOMIC_OPS(add, add, +,  i, .aqrl,         )
> > > > >> >
> > > > >> >Have you checked that .aqrl is equivalent to "ordered", since
> > > > >> >there are interpretations where that isn't the case. Specifically:
> > > > >> >
> > > > >> >// all variables zero at start of time
> > > > >> >P0:
> > > > >> >WRITE_ONCE(x) = 1;
> > > > >> >atomic_add_return(y, 1);
> > > > >> >WRITE_ONCE(z) = 1;
> > > > >> >
> > > > >> >P1:
> > > > >> >READ_ONCE(z) // reads 1
> > > > >> >smp_rmb();
> > > > >> >READ_ONCE(x) // must not read 0
> > > > >>
> > > > >> I haven't.  We don't quite have a formal memory model specification
> > yet.
> > > > >> I've added Daniel Lustig, who is creating that model.  He should
> > > > >> have a better idea
> > > > >
> > > > > Thanks. You really do need to ensure that, as it's heavily relied upon.
> > > >
> > > > I know it's the case for our current processors, and I'm pretty sure
> > > > it's the case for what's formally specified, but we'll have to wait
> > > > for the spec in order to prove it.
> > >
> > > I think Will is right.  In the current spec, using .aqrl converts an
> > > RCpc load or store into an RCsc load or store, but the acquire(-RCsc)
> > > annotation still only applies to the load part of the atomic, and the
> > > release(-RCsc) annotation applies only to the store part of the atomic.
> > >
> > > Why is that?  Picture an machine which implements AMOs using something
> > > that looks more like an LR/SC under the covers, or one that uses cache
> > > line locking, or anything else along those same lines.  In some such
> > > machines, there could be a window between lock/reserve and
> > > unlock/store-conditional where other later stores could squeeze into, and
> > that would break Will's example among others.
> > >
> > > It's likely the same reasoning that causes ARM to use a trailing dmb
> > > here, rather than just using ldaxr/stlxr.  Is that right Will?  I know
> > > that's LL/SC and this particular cases uses AMOADD, but it's the same
> > > principle.  Well, at least according to how we have it in the current memory
> > model draft.
> > >
> > > Also, RISC-V currently prefers leading fence mappings, so I think the
> > > result here, for atomic_add_return() for example, should be this:
> > >
> > > fence rw,rw
> > > amoadd.aq ...
> > >
> > 
> > Hmm.. if atomic_add_return() is implemented like that, how about the
> > following case:
> > 
> > 	{x=0, y=0}
> > 
> > 	P1:
> > 
> > 	r1 = atomic_add_return(&x, 1); // r1 == 0, x will 1 afterwards
> > 	WRITE_ONCE(y, 1);
> > 
> > 	P2:
> > 
> > 	r2 = READ_ONCE(y); // r2 = 1
> > 	smp_rmb();
> > 	r3 = atomic_read(&x); // r3 = 0?
> > 
> > , could this result in r1 == 1 && r2 == 1 && r3 == 0? Given you said .aq only
> > effects the load part of AMO, and I don't see anything here preventing the
> > reordering between store of y and the store part of the AMO on P1.
> > 
> > Note: we don't allow (r1 == 1 && r2 == 1 && r3 == 0) in above case for linux
> > kernel. Please see Documentation/atomic_t.txt:
> > 
> > "Fully ordered primitives are ordered against everything prior and everything
> > subsequent. Therefore a fully ordered primitive is like having an smp_mb()
> > before and an smp_mb() after the primitive."
> 
> Yes, you're right Boqun.  Good catch, and sorry for over-optimizing too quickly.
> 
> In that case, maybe we should just start out having a fence on both sides for

Actually, given your architecture is RCsc rather than RCpc, so I think
maybe you could follow the way that ARM uses(i.e. relaxed load + release
store + a full barrier). You can see the commit log of 8e86f0b409a4
("arm64: atomics: fix use of acquire + release for full barrier
semantics") for the reasoning:
	
	https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=8e86f0b409a44193f1587e87b69c5dcf8f65be67

> now, and then we'll discuss offline whether we want to change the model's
> behavior here.
> 

Sounds great! Any estimation when we can see that(maybe a draft)?

Regards,
Boqun

> Dan

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

  reply	other threads:[~2017-11-16  1:51 UTC|newest]

Thread overview: 46+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-09-27  1:56 RISC-V Linux Port v9 Palmer Dabbelt
2017-09-27  1:56 ` Palmer Dabbelt
2017-09-27  1:56 ` [PATCH v9 02/12] lib: Add shared copies of some GCC library routines Palmer Dabbelt
     [not found] ` <20170927015638.19443-1-palmer-96lFi9zoCfxBDgjK7y7TUQ@public.gmane.org>
2017-09-27  1:56   ` [PATCH v9 01/12] MAINTAINERS: Add RISC-V Palmer Dabbelt
2017-09-27  1:56     ` Palmer Dabbelt
2017-09-27  1:56   ` [PATCH v9 03/12] dt-bindings: RISC-V CPU Bindings Palmer Dabbelt
2017-09-27  1:56     ` Palmer Dabbelt
2017-10-05 10:16     ` Mark Rutland
2017-11-20  7:35       ` [patches] " Jonathan Neuschäfer
2017-11-20  7:35         ` Jonathan Neuschäfer
2017-11-20 19:45         ` Palmer Dabbelt
2017-09-27  1:56   ` [PATCH v9 05/12] RISC-V: Atomic and Locking Code Palmer Dabbelt
2017-09-27  1:56     ` Palmer Dabbelt
     [not found]     ` <20170927015638.19443-6-palmer-96lFi9zoCfxBDgjK7y7TUQ@public.gmane.org>
2017-10-24 14:10       ` Will Deacon
2017-10-24 14:10         ` Will Deacon
2017-11-14 20:30         ` Palmer Dabbelt
2017-11-15 18:06           ` Will Deacon
2017-11-15 19:48             ` [patches] " Palmer Dabbelt
2017-11-15 23:59               ` Daniel Lustig
2017-11-16  1:19                 ` Boqun Feng
2017-11-16  1:31                   ` Daniel Lustig
2017-11-16  1:52                     ` Boqun Feng [this message]
2017-11-16  6:40                       ` Daniel Lustig
2017-11-16 10:25                         ` Will Deacon
2017-11-16 17:12                           ` Daniel Lustig
2017-11-16  2:08                 ` Palmer Dabbelt
2017-09-27  1:56   ` [PATCH v9 10/12] RISC-V: Paging and MMU Palmer Dabbelt
2017-09-27  1:56     ` Palmer Dabbelt
2017-09-27  1:56   ` [PATCH v9 12/12] RISC-V: Build Infrastructure Palmer Dabbelt
2017-09-27  1:56     ` Palmer Dabbelt
2017-09-27  1:56 ` [PATCH v9 04/12] RISC-V: Init and Halt Code Palmer Dabbelt
2017-10-05 11:01   ` Mark Rutland
2018-07-30 23:42     ` Palmer Dabbelt
2018-07-30 23:42       ` Palmer Dabbelt
2018-07-31 13:03       ` Mark Rutland
2018-07-31 13:03         ` Mark Rutland
2017-09-27  1:56 ` [PATCH v9 06/12] RISC-V: Generic library routines and assembly Palmer Dabbelt
2017-09-27  1:56 ` [PATCH v9 07/12] RISC-V: ELF and module implementation Palmer Dabbelt
2017-09-27  1:56 ` [PATCH v9 08/12] RISC-V: Task implementation Palmer Dabbelt
2017-09-27  1:56 ` [PATCH v9 09/12] RISC-V: Device, timer, IRQs, and the SBI Palmer Dabbelt
2017-09-27  1:56 ` [PATCH v9 11/12] RISC-V: User-facing API Palmer Dabbelt
2017-09-27  6:08 ` RISC-V Linux Port v9 Arnd Bergmann
     [not found]   ` <CAK8P3a1ROLHHY9HE0LtPywhTMqBaHjp8kd4ZVBr3iWTyveBh9A-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2017-10-05  0:21     ` Palmer Dabbelt
2017-10-05  0:21       ` Palmer Dabbelt
2017-10-05  7:34       ` Arnd Bergmann
2017-10-05  7:34         ` Arnd Bergmann

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=20171116015212.GF6280@tardis \
    --to=boqun.feng@gmail.com \
    --cc=arnd@arndb.de \
    --cc=dlustig@nvidia.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=olof@lixom.net \
    --cc=palmer@dabbelt.com \
    --cc=patches@groups.riscv.org \
    --cc=peterz@infradead.org \
    --cc=will.deacon@arm.com \
    /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.