From: Daniel Lustig <dlustig@nvidia.com>
To: Palmer Dabbelt <palmer@sifive.com>, <parri.andrea@gmail.com>
Cc: <peterz@infradead.org>, <paulmck@linux.vnet.ibm.com>,
<linux-kernel@vger.kernel.org>, <albert@sifive.com>,
<stern@rowland.harvard.edu>, Will Deacon <will.deacon@arm.com>,
<boqun.feng@gmail.com>, <npiggin@gmail.com>,
<dhowells@redhat.com>, <j.alglave@ucl.ac.uk>,
<luc.maranget@inria.fr>, <akiyks@gmail.com>, <mingo@kernel.org>,
Linus Torvalds <torvalds@linux-foundation.org>,
<linux-riscv@lists.infradead.org>
Subject: Re: [RFC PATCH] riscv/locking: Strengthen spin_lock() and spin_unlock()
Date: Thu, 1 Mar 2018 14:21:17 -0800 [thread overview]
Message-ID: <ddd5ca34-805b-60c4-bf2a-d6a9d95d89e7@nvidia.com> (raw)
In-Reply-To: <mhng-82f403f2-fa94-4fdd-8770-3ee6f79a6752@palmer-si-x1c4>
On 3/1/2018 1:54 PM, Palmer Dabbelt wrote:
> On Thu, 01 Mar 2018 07:11:41 PST (-0800), parri.andrea@gmail.com wrote:
>> Hi Daniel,
>>
>> On Thu, Feb 22, 2018 at 11:47:57AM -0800, Daniel Lustig wrote:
>>> On 2/22/2018 10:27 AM, Peter Zijlstra wrote:
>>> > On Thu, Feb 22, 2018 at 10:13:17AM -0800, Paul E. McKenney wrote:
>>> >> So we have something that is not all that rare in the Linux kernel
>>> >> community, namely two conflicting more-or-less concurrent changes.
>>> >> This clearly needs to be resolved, either by us not strengthening the
>>> >> Linux-kernel memory model in the way we were planning to or by you
>>> >> strengthening RISC-V to be no weaker than PowerPC for these sorts of
>>> >> externally viewed release-acquire situations.
>>> >>
>>> >> Other thoughts?
>>> >
>>> > Like said in the other email, I would _much_ prefer to not go weaker
>>> > than PPC, I find that PPC is already painfully weak at times.
>>>
>>> Sure, and RISC-V could make this work too by using RCsc instructions
>>> and/or by using lightweight fences instead. It just wasn't clear at
>>> first whether smp_load_acquire() and smp_store_release() were RCpc,
>>> RCsc, or something else, and hence whether RISC-V would actually need
>>> to use something stronger than pure RCpc there. Likewise for
>>> spin_unlock()/spin_lock() and everywhere else this comes up.
>>
>> while digging into riscv's locks and atomics to fix the issues discussed
>> earlier in this thread, I became aware of another issue:
>>
>> Considering here the CMPXCHG primitives, for example, I noticed that the
>> implementation currently provides the four variants
>>
>> ATOMIC_OPS( , .aqrl)
>> ATOMIC_OPS(_acquire, .aq)
>> ATOMIC_OPS(_release, .rl)
>> ATOMIC_OPS(_relaxed, )
>>
>> (corresponding, resp., to
>>
>> atomic_cmpxchg()
>> atomic_cmpxchg_acquire()
>> atomic_cmpxchg_release()
>> atomic_cmpxchg_relaxed() )
>>
>> so that the first variant above ends up doing
>>
>> 0: lr.w.aqrl %0, %addr
>> bne %0, %old, 1f
>> sc.w.aqrl %1, %new, %addr
>> bnez %1, 0b
>> 1:
>>
>> From Sect. 2.3.5. ("Acquire/Release Ordering") of the Spec.,
>>
>> "AMOs with both .aq and .rl set are fully-ordered operations. Treating
>> the load part and the store part as independent RCsc operations is not
>> in and of itself sufficient to enforce full fencing behavior, but this
>> subtle weak behavior is counterintuitive and not much of an advantage
>> architecturally, especially with lr and sc also available [...]."
>>
>> I understand that
>>
>> { x = y = u = v = 0 }
>>
>> P0()
>>
>> WRITE_ONCE(x, 1); ("relaxed" store, sw)
>> atomic_cmpxchg(&u, 0, 1);
>> r0 = READ_ONCE(y); ("relaxed" load, lw)
>>
>> P1()
>>
>> WRITE_ONCE(y, 1);
>> atomic_cmpxchg(&v, 0, 1);
>> r1 = READ_ONCE(x);
>>
>> could result in (u = v = 1 and r0 = r1 = 0) at the end; can you confirm?
>
> cmpxchg isn't an AMO, it's an LR SC sequence, so that blurb doesn't
> apply. I think "lr.w.aqrl" and "sc.w.aqrl" is not sufficient to
> perform a fully ordered operation (ie, it's an incorrect
> implementation of atomic_cmpxchg()), but I was hoping to get some
> time to actually internalize this part of the RISC-V memory model at
> some point to be sure.
Agreed, the current intention is that we'll add a fence rw,rw in there
when we use lr/sc as the implementation, likely similar to what ARM does:
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=8e86f0b409a44193f1587e87b69c5dcf8f65be67
It's also probably not the only piece of synchronization-related code
we'll have to go back and audit as we finalize the RISC-V memory
consistency model over the next couple months or so.
Dan
next prev parent reply other threads:[~2018-03-01 22:21 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-02-22 12:19 Andrea Parri
2018-02-22 12:44 ` Andrea Parri
2018-02-22 13:40 ` Peter Zijlstra
2018-02-22 14:12 ` Andrea Parri
2018-02-22 17:27 ` Daniel Lustig
2018-02-22 18:13 ` Paul E. McKenney
2018-02-22 18:27 ` Peter Zijlstra
2018-02-22 19:47 ` Daniel Lustig
2018-02-23 11:16 ` Andrea Parri
2018-02-26 10:39 ` Will Deacon
2018-02-26 14:21 ` Luc Maranget
2018-02-26 16:06 ` Linus Torvalds
2018-02-26 16:24 ` Will Deacon
2018-02-26 17:00 ` Linus Torvalds
2018-02-26 17:10 ` Will Deacon
2018-03-06 13:00 ` Peter Zijlstra
2018-02-27 5:06 ` Boqun Feng
2018-02-27 10:16 ` Boqun Feng
2018-03-01 15:11 ` Andrea Parri
2018-03-01 21:54 ` Palmer Dabbelt
2018-03-01 22:21 ` Daniel Lustig [this message]
2018-02-22 20:02 ` Paul E. McKenney
2018-02-22 18:21 ` Peter Zijlstra
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=ddd5ca34-805b-60c4-bf2a-d6a9d95d89e7@nvidia.com \
--to=dlustig@nvidia.com \
--cc=akiyks@gmail.com \
--cc=albert@sifive.com \
--cc=boqun.feng@gmail.com \
--cc=dhowells@redhat.com \
--cc=j.alglave@ucl.ac.uk \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-riscv@lists.infradead.org \
--cc=luc.maranget@inria.fr \
--cc=mingo@kernel.org \
--cc=npiggin@gmail.com \
--cc=palmer@sifive.com \
--cc=parri.andrea@gmail.com \
--cc=paulmck@linux.vnet.ibm.com \
--cc=peterz@infradead.org \
--cc=stern@rowland.harvard.edu \
--cc=torvalds@linux-foundation.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
Powered by JetHome