From: Boqun Feng <boqun.feng@gmail.com>
To: Peter Zijlstra <peterz@infradead.org>
Cc: torvalds@linux-foundation.org, mingo@kernel.org,
tglx@linutronix.de, will.deacon@arm.com,
paulmck@linux.vnet.ibm.com, waiman.long@hpe.com,
fweisbec@gmail.com, 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,
cmetcalf@mellanox.com, jcmvbkbc@gmail.com, arnd@arndb.de,
dbueso@suse.de, fengguang.wu@intel.com
Subject: Re: [RFC][PATCH 18/31] locking,powerpc: Implement atomic{,64}_fetch_{add,sub,and,or,xor}{,_relaxed,_acquire,_release}()
Date: Sat, 23 Apr 2016 00:41:57 +0800 [thread overview]
Message-ID: <20160422164157.GB3369@insomnia> (raw)
In-Reply-To: <20160422093924.212277819@infradead.org>
[-- Attachment #1: Type: text/plain, Size: 4498 bytes --]
On Fri, Apr 22, 2016 at 11:04:31AM +0200, 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).
>
>
> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
> ---
> arch/powerpc/include/asm/atomic.h | 83 +++++++++++++++++++++++++++++++++-----
> 1 file changed, 74 insertions(+), 9 deletions(-)
>
> --- a/arch/powerpc/include/asm/atomic.h
> +++ b/arch/powerpc/include/asm/atomic.h
> @@ -78,21 +78,53 @@ static inline int atomic_##op##_return_r
> return t; \
> }
>
> +#define ATOMIC_FETCH_OP_RELAXED(op, asm_op) \
> +static inline int atomic_fetch_##op##_relaxed(int a, atomic_t *v) \
> +{ \
> + int res, t; \
> + \
> + __asm__ __volatile__( \
> +"1: lwarx %0,0,%4 # atomic_fetch_" #op "_relaxed\n" \
> + #asm_op " %1,%2,%0\n" \
Should be
#asm_op " %1,%3,%0\n"
right? Because %2 is v->counter and %3 is @a.
Regards,
Boqun
> + PPC405_ERR77(0, %4) \
> +" stwcx. %1,0,%4\n" \
> +" bne- 1b\n" \
> + : "=&r" (res), "=&r" (t), "+m" (v->counter) \
> + : "r" (a), "r" (&v->counter) \
> + : "cc"); \
> + \
> + return res; \
> +}
> +
> #define ATOMIC_OPS(op, asm_op) \
> ATOMIC_OP(op, asm_op) \
> - ATOMIC_OP_RETURN_RELAXED(op, asm_op)
> + ATOMIC_OP_RETURN_RELAXED(op, asm_op) \
> + ATOMIC_FETCH_OP_RELAXED(op, asm_op)
>
> ATOMIC_OPS(add, add)
> ATOMIC_OPS(sub, subf)
>
> -ATOMIC_OP(and, and)
> -ATOMIC_OP(or, or)
> -ATOMIC_OP(xor, xor)
> -
> #define atomic_add_return_relaxed atomic_add_return_relaxed
> #define atomic_sub_return_relaxed atomic_sub_return_relaxed
>
> +#define atomic_fetch_add_relaxed atomic_fetch_add_relaxed
> +#define atomic_fetch_sub_relaxed atomic_fetch_sub_relaxed
> +
> +#undef ATOMIC_OPS
> +#define ATOMIC_OPS(op, asm_op) \
> + ATOMIC_OP(op, asm_op) \
> + ATOMIC_FETCH_OP_RELAXED(op, asm_op)
> +
> +ATOMIC_OPS(and, and)
> +ATOMIC_OPS(or, or)
> +ATOMIC_OPS(xor, xor)
> +
> +#define atomic_fetch_and_relaxed atomic_fetch_and_relaxed
> +#define atomic_fetch_or_relaxed atomic_fetch_or_relaxed
> +#define atomic_fetch_xor_relaxed atomic_fetch_xor_relaxed
> +
> #undef ATOMIC_OPS
> +#undef ATOMIC_FETCH_OP_RELAXED
> #undef ATOMIC_OP_RETURN_RELAXED
> #undef ATOMIC_OP
>
> @@ -329,20 +361,53 @@ atomic64_##op##_return_relaxed(long a, a
> return t; \
> }
>
> +#define ATOMIC64_FETCH_OP_RELAXED(op, asm_op) \
> +static inline long \
> +atomic64_fetch_##op##_relaxed(long a, atomic64_t *v) \
> +{ \
> + long res, t; \
> + \
> + __asm__ __volatile__( \
> +"1: ldarx %0,0,%4 # atomic64_fetch_" #op "_relaxed\n" \
> + #asm_op " %1,%3,%0\n" \
> +" stdcx. %1,0,%4\n" \
> +" bne- 1b\n" \
> + : "=&r" (res), "=&r" (t), "+m" (v->counter) \
> + : "r" (a), "r" (&v->counter) \
> + : "cc"); \
> + \
> + return t; \
> +}
> +
> #define ATOMIC64_OPS(op, asm_op) \
> ATOMIC64_OP(op, asm_op) \
> - ATOMIC64_OP_RETURN_RELAXED(op, asm_op)
> + ATOMIC64_OP_RETURN_RELAXED(op, asm_op) \
> + ATOMIC64_FETCH_OP_RELAXED(op, asm_op)
>
> ATOMIC64_OPS(add, add)
> ATOMIC64_OPS(sub, subf)
> -ATOMIC64_OP(and, and)
> -ATOMIC64_OP(or, or)
> -ATOMIC64_OP(xor, xor)
>
> #define atomic64_add_return_relaxed atomic64_add_return_relaxed
> #define atomic64_sub_return_relaxed atomic64_sub_return_relaxed
>
> +#define atomic64_fetch_add_relaxed atomic64_fetch_add_relaxed
> +#define atomic64_fetch_sub_relaxed atomic64_fetch_sub_relaxed
> +
> +#undef ATOMIC64_OPS
> +#define ATOMIC64_OPS(op, asm_op) \
> + ATOMIC64_OP(op, asm_op) \
> + ATOMIC64_FETCH_OP_RELAXED(op, asm_op)
> +
> +ATOMIC64_OPS(and, and)
> +ATOMIC64_OPS(or, or)
> +ATOMIC64_OPS(xor, xor)
> +
> +#define atomic64_fetch_and_relaxed atomic64_fetch_and_relaxed
> +#define atomic64_fetch_or_relaxed atomic64_fetch_or_relaxed
> +#define atomic64_fetch_xor_relaxed atomic64_fetch_xor_relaxed
> +
> #undef ATOPIC64_OPS
> +#undef ATOMIC64_FETCH_OP_RELAXED
> #undef ATOMIC64_OP_RETURN_RELAXED
> #undef ATOMIC64_OP
>
>
>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 473 bytes --]
next prev parent reply other threads:[~2016-04-22 16:38 UTC|newest]
Thread overview: 79+ 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 11:09 ` Geert Uytterhoeven
2016-04-22 14:18 ` Peter Zijlstra
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 10:50 ` Vineet Gupta
2016-04-22 14:16 ` Peter Zijlstra
2016-04-22 14:16 ` Peter Zijlstra
2016-04-25 4:26 ` Vineet Gupta
2016-04-25 4:26 ` Vineet Gupta
2016-04-22 14:26 ` Peter Zijlstra
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 14:23 ` 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-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 [this message]
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
2016-04-25 21:10 ` Chris Metcalf
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-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 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=20160422164157.GB3369@insomnia \
--to=boqun.feng@gmail.com \
--cc=arnd@arndb.de \
--cc=cmetcalf@mellanox.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 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.