From: Peter Hurley <peter@hurleysoftware.com>
To: paulmck@linux.vnet.ibm.com
Cc: Peter Zijlstra <peterz@infradead.org>,
Kent Overstreet <kmo@daterainc.com>,
Sedat Dilek <sedat.dilek@gmail.com>,
Dave Jones <davej@codemonkey.org.uk>,
Linus Torvalds <torvalds@linux-foundation.org>,
LKML <linux-kernel@vger.kernel.org>, Chris Mason <clm@fb.com>
Subject: Re: Linux 3.19-rc3
Date: Mon, 02 Feb 2015 14:03:33 -0500 [thread overview]
Message-ID: <54CFCA05.2070404@hurleysoftware.com> (raw)
In-Reply-To: <20150202161105.GB19109@linux.vnet.ibm.com>
On 02/02/2015 11:11 AM, Paul E. McKenney wrote:
> On Tue, Jan 20, 2015 at 09:03:12AM -0500, Peter Hurley wrote:
>> On 01/19/2015 07:30 PM, Paul E. McKenney wrote:
>>> On Tue, Jan 06, 2015 at 12:47:53PM -0800, Paul E. McKenney wrote:
>>>> On Tue, Jan 06, 2015 at 02:57:37PM -0500, Peter Hurley wrote:
>>>
>>> [ . . . ]
>>>
>>>> David Miller's call, actually.
>>>>
>>>> But the rule is that if it is an atomic read-modify-write operation and it
>>>> returns a value, then the operation itself needs to include full memory
>>>> barriers before and after (as in the caller doesn't need to add them).
>>>> Otherwise, the operation does not need to include memory ordering.
>>>> Since xchg(), atomic_xchg(), and atomic_long_xchg() all return a value,
>>>> their implementations must include full memory barriers before and after.
>>>>
>>>> Pretty straightforward. ;-)
>>>
>>> Hello again, Peter,
>>>
>>> Were you going to push a patch clarifying this?
>>
>> Hi Paul,
>>
>> As you pointed out, atomic_ops.txt is for arch implementors, so I wasn't
>> planning on patching that file.
>>
>> I've been meaning to write up something specifically for everyone else but
>> my own bugs have kept me from that. [That, and I'm not sure what I write
>> will be suitable for Documentation.]
>
> Well, upon revisiting this after coming back from travel, I am more inclined
> to agree that a change would be good. I doubt if you would be the only
> person who might be confused. So how about the following patch?
I think this is much clearer to both audiences. Thanks!
Regards,
Peter Hurley
[minor corrections below]
> ------------------------------------------------------------------------
>
> documentation: Clarify memory-barrier semantics of atomic operations
>
> All value-returning atomic read-modify-write operations must provide full
> memory-barrier semantics on both sides of the operation. This commit
> clarifies the documentation to make it clear that these memory-barrier
> semantics are provided by the operations themselves, not by their callers.
>
> Reported-by: Peter Hurley <peter@hurleysoftware.com>
> Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
>
> diff --git a/Documentation/atomic_ops.txt b/Documentation/atomic_ops.txt
> index 183e41bdcb69..672201e79c49 100644
> --- a/Documentation/atomic_ops.txt
> +++ b/Documentation/atomic_ops.txt
> @@ -201,11 +201,11 @@ These routines add 1 and subtract 1, respectively, from the given
> atomic_t and return the new counter value after the operation is
> performed.
>
> -Unlike the above routines, it is required that explicit memory
> -barriers are performed before and after the operation. It must be
> -done such that all memory operations before and after the atomic
> -operation calls are strongly ordered with respect to the atomic
> -operation itself.
> +Unlike the above routines, it is required that these primitives
> +inlude explicit memory barriers that are performed before and after
^^^^^^
include|provide
> +the operation. It must be done such that all memory operations before
> +and after the atomic operation calls are strongly ordered with respect
> +to the atomic operation itself.
>
> For example, it should behave as if a smp_mb() call existed both
> before and after the atomic operation.
> @@ -233,21 +233,21 @@ These two routines increment and decrement by 1, respectively, the
> given atomic counter. They return a boolean indicating whether the
> resulting counter value was zero or not.
>
> -It requires explicit memory barrier semantics around the operation as
> -above.
> +Again, these primitive provide explicit memory barrier semantics around
^
s
> +the atomic operation.
>
> int atomic_sub_and_test(int i, atomic_t *v);
>
> This is identical to atomic_dec_and_test() except that an explicit
> -decrement is given instead of the implicit "1". It requires explicit
> -memory barrier semantics around the operation.
> +decrement is given instead of the implicit "1". This primitive must
> +provide explicit memory barrier semantics around the operation.
>
> int atomic_add_negative(int i, atomic_t *v);
>
> -The given increment is added to the given atomic counter value. A
> -boolean is return which indicates whether the resulting counter value
> -is negative. It requires explicit memory barrier semantics around the
> -operation.
> +The given increment is added to the given atomic counter value. A boolean
> +is return which indicates whether the resulting counter value is negative.
> +This primitive must provide explicit memory barrier semantics around
> +the operation.
>
> Then:
>
> @@ -257,7 +257,7 @@ This performs an atomic exchange operation on the atomic variable v, setting
> the given new value. It returns the old value that the atomic variable v had
> just before the operation.
>
> -atomic_xchg requires explicit memory barriers around the operation.
> +atomic_xchg must provide explicit memory barriers around the operation.
>
> int atomic_cmpxchg(atomic_t *v, int old, int new);
>
> @@ -266,7 +266,7 @@ with the given old and new values. Like all atomic_xxx operations,
> atomic_cmpxchg will only satisfy its atomicity semantics as long as all
> other accesses of *v are performed through atomic_xxx operations.
>
> -atomic_cmpxchg requires explicit memory barriers around the operation.
> +atomic_cmpxchg must provide explicit memory barriers around the operation.
>
> The semantics for atomic_cmpxchg are the same as those defined for 'cas'
> below.
> @@ -279,8 +279,8 @@ If the atomic value v is not equal to u, this function adds a to v, and
> returns non zero. If v is equal to u then it returns zero. This is done as
> an atomic operation.
>
> -atomic_add_unless requires explicit memory barriers around the operation
> -unless it fails (returns 0).
> +atomic_add_unless must provide explicit memory barriers around the
> +operation unless it fails (returns 0).
>
> atomic_inc_not_zero, equivalent to atomic_add_unless(v, 1, 0)
>
> @@ -460,9 +460,9 @@ the return value into an int. There are other places where things
> like this occur as well.
>
> These routines, like the atomic_t counter operations returning values,
> -require explicit memory barrier semantics around their execution. All
> -memory operations before the atomic bit operation call must be made
> -visible globally before the atomic bit operation is made visible.
> +must provide explicit memory barrier semantics around their execution.
> +All memory operations before the atomic bit operation call must be
> +made visible globally before the atomic bit operation is made visible.
> Likewise, the atomic bit operation must be visible globally before any
> subsequent memory operation is made visible. For example:
>
> @@ -536,8 +536,9 @@ except that two underscores are prefixed to the interface name.
> These non-atomic variants also do not require any special memory
> barrier semantics.
>
> -The routines xchg() and cmpxchg() need the same exact memory barriers
> -as the atomic and bit operations returning values.
> +The routines xchg() and cmpxchg() must provide the same exact
> +memory-barrier semantics as the atomic and bit operations returning
> +values.
>
> Spinlocks and rwlocks have memory barrier expectations as well.
> The rule to follow is simple:
>
next prev parent reply other threads:[~2015-02-02 19:03 UTC|newest]
Thread overview: 101+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-01-06 4:49 Sedat Dilek
2015-01-06 9:34 ` Sedat Dilek
2015-01-06 9:56 ` Takashi Iwai
2015-01-06 10:06 ` Sedat Dilek
2015-01-06 10:28 ` Takashi Iwai
2015-01-06 10:31 ` Sedat Dilek
2015-01-06 10:37 ` Takashi Iwai
2015-01-06 10:42 ` Sedat Dilek
2015-01-06 9:59 ` Peter Zijlstra
2015-01-06 9:40 ` Peter Zijlstra
2015-01-06 9:42 ` Sedat Dilek
2015-01-06 9:57 ` Sedat Dilek
2015-01-06 10:06 ` Peter Zijlstra
2015-01-06 10:18 ` Sedat Dilek
2015-01-06 11:01 ` Peter Zijlstra
2015-01-06 11:07 ` Kent Overstreet
2015-01-06 11:25 ` Sedat Dilek
2015-01-06 11:40 ` Kent Overstreet
2015-01-06 12:51 ` Sedat Dilek
2015-01-06 11:42 ` Peter Zijlstra
2015-01-06 11:48 ` Peter Zijlstra
2015-01-06 12:01 ` Kent Overstreet
2015-01-06 12:20 ` Peter Zijlstra
2015-01-06 12:45 ` Kent Overstreet
2015-01-06 12:55 ` Peter Hurley
2015-01-06 17:38 ` Paul E. McKenney
2015-01-06 17:58 ` Peter Hurley
2015-01-06 19:25 ` Paul E. McKenney
2015-01-06 19:57 ` Peter Hurley
2015-01-06 20:47 ` Paul E. McKenney
2015-01-20 0:30 ` Paul E. McKenney
2015-01-20 14:03 ` Peter Hurley
2015-02-02 16:11 ` Paul E. McKenney
2015-02-02 19:03 ` Peter Hurley [this message]
2015-02-02 19:33 ` Paul E. McKenney
2015-01-06 11:56 ` Kent Overstreet
2015-01-06 12:16 ` Peter Zijlstra
2015-01-06 12:43 ` Kent Overstreet
2015-01-06 13:03 ` Peter Zijlstra
2015-01-06 13:28 ` Kent Overstreet
2015-01-13 15:23 ` Peter Zijlstra
2015-01-06 11:58 ` Peter Zijlstra
2015-01-06 12:18 ` Kent Overstreet
2015-01-16 16:56 ` Peter Hurley
2015-01-16 17:00 ` Chris Mason
2015-01-16 18:58 ` Peter Hurley
2015-01-06 10:29 ` Sedat Dilek
-- strict thread matches above, loose matches on Subject: below --
2015-01-06 1:46 Linus Torvalds
2015-01-06 2:46 ` Dave Jones
2015-01-06 8:18 ` Takashi Iwai
2015-01-06 9:45 ` Jiri Kosina
2015-01-08 12:51 ` Mark Langsdorf
2015-01-08 13:45 ` Catalin Marinas
2015-01-08 17:29 ` Mark Langsdorf
2015-01-08 17:34 ` Catalin Marinas
2015-01-08 18:48 ` Mark Langsdorf
2015-01-08 19:21 ` Linus Torvalds
2015-01-09 23:27 ` Catalin Marinas
2015-01-10 0:35 ` Kirill A. Shutemov
2015-01-10 2:27 ` Linus Torvalds
2015-01-10 2:51 ` David Lang
2015-01-10 3:06 ` Linus Torvalds
2015-01-10 10:46 ` Andreas Mohr
2015-01-10 19:42 ` Linus Torvalds
2015-01-13 3:33 ` Rik van Riel
2015-01-13 10:28 ` Catalin Marinas
2015-01-10 3:17 ` Tony Luck
2015-01-10 20:16 ` Arnd Bergmann
2015-01-10 21:00 ` Linus Torvalds
2015-01-10 21:36 ` Arnd Bergmann
2015-01-10 21:48 ` Linus Torvalds
2015-01-12 11:37 ` Kirill A. Shutemov
2015-01-12 12:18 ` Catalin Marinas
2015-01-12 13:57 ` Arnd Bergmann
2015-01-12 14:23 ` Catalin Marinas
2015-01-12 15:42 ` Arnd Bergmann
2015-01-12 11:53 ` Catalin Marinas
2015-01-12 13:15 ` Arnd Bergmann
2015-01-08 15:08 ` Michal Hocko
2015-01-08 16:37 ` Mark Langsdorf
2015-01-09 15:56 ` Michal Hocko
2015-01-09 12:13 ` Mark Rutland
2015-01-09 14:19 ` Steve Capper
2015-01-09 14:27 ` Mark Langsdorf
2015-01-09 17:57 ` Mark Rutland
2015-01-09 18:37 ` Marc Zyngier
2015-01-09 19:43 ` Will Deacon
2015-01-10 3:29 ` Laszlo Ersek
2015-01-10 4:39 ` Linus Torvalds
2015-01-10 13:37 ` Will Deacon
2015-01-10 19:47 ` Laszlo Ersek
2015-01-10 19:56 ` Linus Torvalds
2015-01-10 20:08 ` Laszlo Ersek
2015-01-10 19:51 ` Linus Torvalds
2015-01-12 12:42 ` Will Deacon
2015-01-12 13:22 ` Mark Langsdorf
2015-01-12 19:03 ` Dave Hansen
2015-01-12 19:06 ` Linus Torvalds
2015-01-12 19:07 ` Linus Torvalds
2015-01-12 19:24 ` Will Deacon
2015-01-10 15:22 ` Kyle McMartin
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=54CFCA05.2070404@hurleysoftware.com \
--to=peter@hurleysoftware.com \
--cc=clm@fb.com \
--cc=davej@codemonkey.org.uk \
--cc=kmo@daterainc.com \
--cc=linux-kernel@vger.kernel.org \
--cc=paulmck@linux.vnet.ibm.com \
--cc=peterz@infradead.org \
--cc=sedat.dilek@gmail.com \
--cc=torvalds@linux-foundation.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
Powered by JetHome