From: Chris Metcalf <cmetcalf@mellanox.com>
To: Peter Zijlstra <peterz@infradead.org>,
<torvalds@linux-foundation.org>, <mingo@kernel.org>,
<tglx@linutronix.de>, <will.deacon@arm.com>,
<paulmck@linux.vnet.ibm.com>, <boqun.feng@gmail.com>,
<waiman.long@hpe.com>, <fweisbec@gmail.com>
Cc: <linux-kernel@vger.kernel.org>, <linux-arch@vger.kernel.org>,
<rth@twiddle.net>, <vgupta@synopsys.com>,
<linux@arm.linux.org.uk>, <egtvedt@samfundet.no>,
<realmz6@gmail.com>, <ysato@users.sourceforge.jp>,
<rkuo@codeaurora.org>, <tony.luck@intel.com>,
<geert@linux-m68k.org>, <james.hogan@imgtec.com>,
<ralf@linux-mips.org>, <dhowells@redhat.com>,
<jejb@parisc-linux.org>, <mpe@ellerman.id.au>,
<schwidefsky@de.ibm.com>, <dalias@libc.org>,
<davem@davemloft.net>, <jcmvbkbc@gmail.com>, <arnd@arndb.de>,
<dbueso@suse.de>, <fengguang.wu@intel.com>
Subject: Re: [RFC][PATCH 22/31] locking,tile: Implement atomic{,64}_fetch_{add,sub,and,or,xor}()
Date: Mon, 25 Apr 2016 17:10:58 -0400 [thread overview]
Message-ID: <571E87E2.3010306@mellanox.com> (raw)
In-Reply-To: <20160422093924.482859927@infradead.org>
[Grr, resending as text/plain; I have no idea what inspired Thunderbird
to send this as multipart/mixed with HTML.]
On 4/22/2016 5:04 AM, Peter Zijlstra wrote:
> Implement FETCH-OP atomic primitives, these are very similar to the
> existing OP-RETURN primitives we already have, except they return the
> value of the atomic variable_before_ modification.
>
> This is especially useful for irreversible operations -- such as
> bitops (because it becomes impossible to reconstruct the state prior
> to modification).
>
> XXX please look at the tilegx (CONFIG_64BIT) atomics, I think we get
> the barriers wrong (at the very least they're inconsistent).
>
> Signed-off-by: Peter Zijlstra (Intel)<peterz@infradead.org>
> ---
> arch/tile/include/asm/atomic.h | 4 +
> arch/tile/include/asm/atomic_32.h | 60 +++++++++++++------
> arch/tile/include/asm/atomic_64.h | 117 +++++++++++++++++++++++++-------------
> arch/tile/include/asm/bitops_32.h | 18 ++---
> arch/tile/lib/atomic_32.c | 42 ++++++-------
> arch/tile/lib/atomic_asm_32.S | 14 ++--
> 6 files changed, 161 insertions(+), 94 deletions(-)
>
> [...]
> static inline int atomic_add_return(int i, atomic_t *v)
> {
> int val;
> smp_mb(); /* barrier for proper semantics */
> val = __insn_fetchadd4((void *)&v->counter, i) + i;
> barrier(); /* the "+ i" above will wait on memory */
> + /* XXX smp_mb() instead, as per cmpxchg() ? */
> return val;
> }
The existing code is subtle but I'm pretty sure it's not a bug.
The tilegx architecture will take the "+ i" and generate an add instruction.
The compiler barrier will make sure the add instruction happens before
anything else that could touch memory, and the microarchitecture will make
sure that the result of the atomic fetchadd has been returned to the core
before any further instructions are issued. (The memory architecture is
lazy, but when you feed a load through an arithmetic operation, we block
issuing any further instructions until the add's operands are available.)
This would not be an adequate memory barrier in general, since other loads
or stores might still be in flight, even if the "val" operand had made it
from memory to the core at this point. However, we have issued no other
stores or loads since the previous memory barrier, so we know that there
can be no other loads or stores in flight, and thus the compiler barrier
plus arithmetic op is equivalent to a memory barrier here.
In hindsight, perhaps a more substantial comment would have been helpful
here. Unless you see something missing in my analysis, I'll plan to go
ahead and add a suitable comment here :-)
Otherwise, though just based on code inspection so far:
Acked-by: Chris Metcalf<cmetcalf@mellanox.com> [for tile]
--
Chris Metcalf, Mellanox Technologies
http://www.mellanox.com
next prev parent reply other threads:[~2016-04-25 21:11 UTC|newest]
Thread overview: 67+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-04-22 9:04 [RFC][PATCH 00/31] implement atomic_fetch_$op Peter Zijlstra
2016-04-22 9:04 ` [RFC][PATCH 01/31] locking: Flip arguments to atomic_fetch_or Peter Zijlstra
2016-04-22 10:54 ` Will Deacon
2016-04-22 11:09 ` Geert Uytterhoeven
2016-04-22 14:18 ` Peter Zijlstra
2016-04-22 9:04 ` [RFC][PATCH 02/31] locking,alpha: Implement atomic{,64}_fetch_{add,sub,and,andnot,or,xor}() Peter Zijlstra
2016-04-22 16:57 ` Richard Henderson
2016-04-23 1:55 ` Peter Zijlstra
2016-04-22 9:04 ` [RFC][PATCH 03/31] locking,arc: Implement atomic_fetch_{add,sub,and,andnot,or,xor}() Peter Zijlstra
2016-04-22 10:50 ` Vineet Gupta
2016-04-22 14:16 ` Peter Zijlstra
2016-04-25 4:26 ` Vineet Gupta
2016-04-22 14:26 ` Peter Zijlstra
2016-04-22 9:04 ` [RFC][PATCH 04/31] locking,arm: Implement atomic{,64}_fetch_{add,sub,and,andnot,or,xor}{,_relaxed,_acquire,_release}() Peter Zijlstra
2016-04-22 11:35 ` Will Deacon
2016-04-22 9:04 ` [RFC][PATCH 05/31] locking,arm64: " Peter Zijlstra
2016-04-22 11:08 ` Will Deacon
2016-04-22 14:23 ` Will Deacon
2016-04-22 9:04 ` [RFC][PATCH 06/31] locking,avr32: Implement atomic_fetch_{add,sub,and,or,xor}() Peter Zijlstra
2016-04-22 11:58 ` Hans-Christian Noren Egtvedt
2016-04-22 9:04 ` [RFC][PATCH 07/31] locking,blackfin: " Peter Zijlstra
2016-04-22 9:04 ` [RFC][PATCH 08/31] locking,frv: Implement atomic{,64}_fetch_{add,sub,and,or,xor}() Peter Zijlstra
2016-04-22 9:04 ` [RFC][PATCH 09/31] locking,h8300: Implement atomic_fetch_{add,sub,and,or,xor}() Peter Zijlstra
2016-04-22 9:04 ` [RFC][PATCH 10/31] locking,hexagon: " Peter Zijlstra
2016-04-23 2:16 ` Peter Zijlstra
2016-04-26 0:39 ` Richard Kuo
2016-04-22 9:04 ` [RFC][PATCH 11/31] locking,ia64: Implement atomic{,64}_fetch_{add,sub,and,or,xor}() Peter Zijlstra
2016-04-22 9:04 ` [RFC][PATCH 12/31] locking,m32r: Implement atomic_fetch_{add,sub,and,or,xor}() Peter Zijlstra
2016-04-22 9:04 ` [RFC][PATCH 13/31] locking,m68k: " Peter Zijlstra
2016-04-22 9:04 ` [RFC][PATCH 14/31] locking,metag: " Peter Zijlstra
2016-04-30 0:20 ` James Hogan
2016-05-02 8:15 ` Peter Zijlstra
2016-04-22 9:04 ` [RFC][PATCH 15/31] locking,mips: Implement atomic{,64}_fetch_{add,sub,and,or,xor}() Peter Zijlstra
2016-04-22 9:04 ` [RFC][PATCH 16/31] locking,mn10300: Implement atomic_fetch_{add,sub,and,or,xor}() Peter Zijlstra
2016-04-22 9:04 ` [RFC][PATCH 17/31] locking,parisc: Implement atomic{,64}_fetch_{add,sub,and,or,xor}() Peter Zijlstra
2016-04-22 9:04 ` [RFC][PATCH 18/31] locking,powerpc: Implement atomic{,64}_fetch_{add,sub,and,or,xor}{,_relaxed,_acquire,_release}() Peter Zijlstra
2016-04-22 16:41 ` Boqun Feng
2016-04-23 2:31 ` Peter Zijlstra
2016-04-22 9:04 ` [RFC][PATCH 19/31] locking,s390: Implement atomic{,64}_fetch_{add,sub,and,or,xor}() Peter Zijlstra
2016-04-25 8:06 ` Martin Schwidefsky
2016-04-25 8:26 ` Peter Zijlstra
2016-04-22 9:04 ` [RFC][PATCH 20/31] locking,sh: Implement atomic_fetch_{add,sub,and,or,xor}() Peter Zijlstra
2016-04-22 9:04 ` [RFC][PATCH 21/31] locking,sparc: Implement atomic{,64}_fetch_{add,sub,and,or,xor}() Peter Zijlstra
2016-04-22 9:04 ` [RFC][PATCH 22/31] locking,tile: " Peter Zijlstra
2016-04-25 21:10 ` Chris Metcalf [this message]
2016-04-26 14:00 ` [PATCH] tile: clarify barrier semantics of atomic_add_return Chris Metcalf
[not found] ` <571E840A.8090703@mellanox.com>
2016-04-26 15:28 ` [RFC][PATCH 22/31] locking,tile: Implement atomic{,64}_fetch_{add,sub,and,or,xor}() Peter Zijlstra
2016-04-26 15:32 ` Chris Metcalf
2016-04-22 9:04 ` [RFC][PATCH 23/31] locking,x86: " Peter Zijlstra
2016-04-22 9:04 ` [RFC][PATCH 24/31] locking,xtensa: Implement atomic_fetch_{add,sub,and,or,xor}() Peter Zijlstra
2016-04-22 9:04 ` [RFC][PATCH 25/31] locking: Fix atomic64_relaxed bits Peter Zijlstra
2016-04-22 9:04 ` [RFC][PATCH 26/31] locking: Implement atomic{,64,_long}_fetch_{add,sub,and,andnot,or,xor}{,_relaxed,_acquire,_release}() Peter Zijlstra
2016-04-22 9:04 ` [RFC][PATCH 27/31] locking: Remove linux/atomic.h:atomic_fetch_or Peter Zijlstra
2016-04-22 13:02 ` Will Deacon
2016-04-22 14:21 ` Peter Zijlstra
2016-04-22 9:04 ` [RFC][PATCH 28/31] locking: Remove the deprecated atomic_{set,clear}_mask() functions Peter Zijlstra
2016-04-22 9:04 ` [RFC][PATCH 29/31] locking,alpha: Convert to _relaxed atomics Peter Zijlstra
2016-04-22 9:04 ` [RFC][PATCH 30/31] locking,mips: " Peter Zijlstra
2016-04-22 9:04 ` [RFC][PATCH 31/31] locking,qrwlock: Employ atomic_fetch_add_acquire() Peter Zijlstra
2016-04-22 14:25 ` Waiman Long
2016-04-22 9:44 ` [RFC][PATCH 00/31] implement atomic_fetch_$op Peter Zijlstra
2016-04-22 12:56 ` Fengguang Wu
2016-04-22 13:03 ` Will Deacon
2016-04-22 14:23 ` Peter Zijlstra
2016-04-23 1:59 ` Fengguang Wu
2016-04-22 18:35 ` Kalle Valo
2016-04-23 3:23 ` Fengguang Wu
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=571E87E2.3010306@mellanox.com \
--to=cmetcalf@mellanox.com \
--cc=arnd@arndb.de \
--cc=boqun.feng@gmail.com \
--cc=dalias@libc.org \
--cc=davem@davemloft.net \
--cc=dbueso@suse.de \
--cc=dhowells@redhat.com \
--cc=egtvedt@samfundet.no \
--cc=fengguang.wu@intel.com \
--cc=fweisbec@gmail.com \
--cc=geert@linux-m68k.org \
--cc=james.hogan@imgtec.com \
--cc=jcmvbkbc@gmail.com \
--cc=jejb@parisc-linux.org \
--cc=linux-arch@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@arm.linux.org.uk \
--cc=mingo@kernel.org \
--cc=mpe@ellerman.id.au \
--cc=paulmck@linux.vnet.ibm.com \
--cc=peterz@infradead.org \
--cc=ralf@linux-mips.org \
--cc=realmz6@gmail.com \
--cc=rkuo@codeaurora.org \
--cc=rth@twiddle.net \
--cc=schwidefsky@de.ibm.com \
--cc=tglx@linutronix.de \
--cc=tony.luck@intel.com \
--cc=torvalds@linux-foundation.org \
--cc=vgupta@synopsys.com \
--cc=waiman.long@hpe.com \
--cc=will.deacon@arm.com \
--cc=ysato@users.sourceforge.jp \
/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).