linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: Mark Rutland <mark.rutland@arm.com>
To: Andrew Murray <andrew.murray@arm.com>
Cc: Peter Zijlstra <peterz@infradead.org>,
	Catalin Marinas <catalin.marinas@arm.com>,
	Boqun Feng <boqun.feng@gmail.com>,
	Will Deacon <will.deacon@arm.com>,
	Ard.Biesheuvel@arm.com, linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH v3 2/5] arm64: Use correct ll/sc atomic constraints
Date: Wed, 28 Aug 2019 16:25:40 +0100	[thread overview]
Message-ID: <20190828152540.GA42408@lakrids.cambridge.arm.com> (raw)
In-Reply-To: <20190828130118.GW14582@e119886-lin.cambridge.arm.com>

On Wed, Aug 28, 2019 at 02:01:19PM +0100, Andrew Murray wrote:
> On Thu, Aug 22, 2019 at 04:32:23PM +0100, Mark Rutland wrote:
> > Hi Andrew,
> > 
> > On Mon, Aug 12, 2019 at 03:36:22PM +0100, Andrew Murray wrote:
> > > For many of the ll/sc atomic operations we use the 'I' machine constraint
> > > regardless to the instruction used - this may not be optimal.
> > >
> > > Let's add an additional parameter to the ATOMIC_xx macros that allows the
> > > caller to specify an appropriate machine constraint.
> > > 
> > > Let's also improve __CMPXCHG_CASE by replacing the 'K' constraint with a
> > > caller provided constraint. Please note that whilst we would like to use
> > > the 'K' constraint on 32 bit operations, we choose not to provide any
> > > constraint to avoid a GCC bug which results in a build error.
> > > 
> > > Earlier versions of GCC (no later than 8.1.0) appear to incorrectly handle
> > > the 'K' constraint for the value 4294967295.
> > 
> > From reading the above, it's difficult to discern what's a fix and
> > what's an improvement, and I think we need to be more explicit about
> > that. It would also be helpful to have the necessary context up-front.
> > 
> > How about:
> > 
> > | The A64 ISA accepts distinct (but overlapping) ranges of immediates for:
> > | 
> > | * add arithmetic instructions ('I' machine constraint)
> > | * sub arithmetic instructions ('J' machine constraint)
> > | * 32-bit logical instructions ('K' machine constraint)
> > | * 64-bit logical instructions ('L' machine constraint)
> > | 
> > | ... but we currently use the 'I' constraint for many atomic operations
> > | using sub or logical instructions, which is not always valid.
> > | 
> > | When CONFIG_ARM64_LSE_ATOMICS is not set, this allows invalid immediates
> > | to be passed to instructions, potentially resulting in a build failure.
> > | When CONFIG_ARM64_LSE_ATOMICS is selected the out-of-line ll/sc atomics
> > | always use a register as they have no visibility of the value passed by
> > | the caller.
> > |
> > | This patch adds a constraint parameter to the ATOMIC_xx and
> > | __CMPXCHG_CASE macros so that we can pass appropriate constraints for
> > | each case, with uses updated accordingly.
> > | 
> > | Unfortunately prior to GCC 8.1.0 the 'K' constraint erroneously accepted
> > | 0xffffffff, so we must instead force the use of a register.
> 
> Looks great - I'll adopt this, thanks for writing it.

Cool. :)

> > Given we haven't had any bug reports, I'm not sure whether this needs a
> > Fixes tag or Cc stable. This has been a latent issue for a long time,
> > but upstream code doesn't seem to have tickled it.
> 
> Yes I guess this is more a correctness issue rather than a reproducible bug
> in upstream code. I won't add a fixes tag or CC to stable.

Sounds good to me.

> > [...]
> > 
> > > -ATOMIC_OPS(and, and)
> > > -ATOMIC_OPS(andnot, bic)
> > > -ATOMIC_OPS(or, orr)
> > > -ATOMIC_OPS(xor, eor)
> > > +ATOMIC_OPS(and, and, K)
> > > +ATOMIC_OPS(andnot, bic, )
> > > +ATOMIC_OPS(or, orr, K)
> > > +ATOMIC_OPS(xor, eor, K)
> > 
> > Surely it's not safe to use the K constraint here, either? AFAICT code
> > like:
> > 
> >   atomic_xor(~0, &atom);
> > 
> > ... would suffer from the same problem as described for cmpxchg.
> 
> Thanks for spotting this.
> 
> Yes, I think the resolution here (and for any 32bit bitmask immediate) is to
> drop the constraint.
> 
> Do you agree that we should drop the 'K' constraint for both orr and eor
> above?

Yes, I think we should drop the 'K' for all the 32-bit logical ops.

> > [...]
> > 
> > > -ATOMIC64_OPS(and, and)
> > > -ATOMIC64_OPS(andnot, bic)
> > > -ATOMIC64_OPS(or, orr)
> > > -ATOMIC64_OPS(xor, eor)
> > > +ATOMIC64_OPS(and, and, K)
> > > +ATOMIC64_OPS(andnot, bic, )
> > > +ATOMIC64_OPS(or, orr, K)
> > > +ATOMIC64_OPS(xor, eor, K)
> > 
> > Shouldn't these be 'L'?
> > 
> > IIUC K is a subset of L, so if that's deliberate we should call that out
> > explicitly...
> 
> Oooh yes that's wrong. I guess the atomic64_[and,or,xor] are rarely called
> in the kernel which perhaps is why the compiler hasn't shouted at me.
> 
> Do you agree that the and, orr and eor should all be 'L' instead of 'K'?

Yes, I think all the 64-bit logical ops should all use 'L'.

I did a quick local test, and the 'L' constraint seems to correctly
reject ~0UL (i.e. it doesn't seem to have a similar bug to the 'K'
constraint).

> > > +__CMPXCHG_CASE(w, b,     ,  8,        ,  ,  ,         , )
> > > +__CMPXCHG_CASE(w, h,     , 16,        ,  ,  ,         , )
> > > +__CMPXCHG_CASE(w,  ,     , 32,        ,  ,  ,         , )
> > > +__CMPXCHG_CASE( ,  ,     , 64,        ,  ,  ,         , L)
> > > +__CMPXCHG_CASE(w, b, acq_,  8,        , a,  , "memory", )
> > > +__CMPXCHG_CASE(w, h, acq_, 16,        , a,  , "memory", )
> > > +__CMPXCHG_CASE(w,  , acq_, 32,        , a,  , "memory", )
> > > +__CMPXCHG_CASE( ,  , acq_, 64,        , a,  , "memory", L)
> > > +__CMPXCHG_CASE(w, b, rel_,  8,        ,  , l, "memory", )
> > > +__CMPXCHG_CASE(w, h, rel_, 16,        ,  , l, "memory", )
> > > +__CMPXCHG_CASE(w,  , rel_, 32,        ,  , l, "memory", )
> > > +__CMPXCHG_CASE( ,  , rel_, 64,        ,  , l, "memory", L)
> > > +__CMPXCHG_CASE(w, b,  mb_,  8, dmb ish,  , l, "memory", )
> > > +__CMPXCHG_CASE(w, h,  mb_, 16, dmb ish,  , l, "memory", )
> > > +__CMPXCHG_CASE(w,  ,  mb_, 32, dmb ish,  , l, "memory", )
> > > +__CMPXCHG_CASE( ,  ,  mb_, 64, dmb ish,  , l, "memory", L)
> > 
> > ... but these uses imply that's not the case.
> 
> Yup, so I can leave these as they are.

Yup; sounds good.

Thanks,
Mark.

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  reply	other threads:[~2019-08-28 15:26 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-08-12 14:36 [PATCH v3 0/5] arm64: avoid out-of-line ll/sc atomics Andrew Murray
2019-08-12 14:36 ` [PATCH v3 1/5] jump_label: Don't warn on __exit jump entries Andrew Murray
2019-08-22 15:32   ` Mark Rutland
2019-08-22 18:41     ` Andrew Murray
2019-08-12 14:36 ` [PATCH v3 2/5] arm64: Use correct ll/sc atomic constraints Andrew Murray
2019-08-22 15:32   ` Mark Rutland
2019-08-28 13:01     ` Andrew Murray
2019-08-28 15:25       ` Mark Rutland [this message]
2019-08-28 15:44         ` Andrew Murray
2019-08-28 16:24           ` Mark Rutland
2019-08-28 16:42             ` Andrew Murray
2019-08-12 14:36 ` [PATCH v3 3/5] arm64: atomics: avoid out-of-line ll/sc atomics Andrew Murray
2019-08-22 17:01   ` Mark Rutland
2019-08-28 11:53     ` Andrew Murray
2019-08-12 14:36 ` [PATCH v3 4/5] arm64: avoid using hard-coded registers for LSE atomics Andrew Murray
2019-08-12 14:36 ` [PATCH v3 5/5] arm64: atomics: remove atomic_ll_sc compilation unit Andrew Murray
2019-08-27 16:49 ` [PATCH v3 0/5] arm64: avoid out-of-line ll/sc atomics Will Deacon
2019-08-28  9:04   ` Andrew Murray

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=20190828152540.GA42408@lakrids.cambridge.arm.com \
    --to=mark.rutland@arm.com \
    --cc=Ard.Biesheuvel@arm.com \
    --cc=andrew.murray@arm.com \
    --cc=boqun.feng@gmail.com \
    --cc=catalin.marinas@arm.com \
    --cc=linux-arm-kernel@lists.infradead.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).