* [PATCH 1/2] atomic: Allow atomic_inc_not_zero to be overridden
@ 2012-03-01 7:09 Anton Blanchard
2012-03-01 7:12 ` [PATCH 2/2] powerpc: atomic: Implement atomic*_inc_not_zero Anton Blanchard
` (2 more replies)
0 siblings, 3 replies; 8+ messages in thread
From: Anton Blanchard @ 2012-03-01 7:09 UTC (permalink / raw)
To: benh, paulus, akpm, asharma, vapier, eric.dumazet, linuxppc-dev,
linux-kernel
We want to implement a ppc64 specific version of atomic_inc_not_zero
so wrap it in an ifdef to allow it to be overridden.
Signed-off-by: Anton Blanchard <anton@samba.org>
---
Index: linux-build/include/linux/atomic.h
===================================================================
--- linux-build.orig/include/linux/atomic.h 2012-02-11 14:59:23.284714257 +1100
+++ linux-build/include/linux/atomic.h 2012-02-11 15:01:14.894764555 +1100
@@ -24,7 +24,9 @@ static inline int atomic_add_unless(atom
* Atomically increments @v by 1, so long as @v is non-zero.
* Returns non-zero if @v was non-zero, and zero otherwise.
*/
+#ifndef atomic_inc_not_zero
#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
+#endif
/**
* atomic_inc_not_zero_hint - increment if not null
^ permalink raw reply [flat|nested] 8+ messages in thread* [PATCH 2/2] powerpc: atomic: Implement atomic*_inc_not_zero 2012-03-01 7:09 [PATCH 1/2] atomic: Allow atomic_inc_not_zero to be overridden Anton Blanchard @ 2012-03-01 7:12 ` Anton Blanchard 2012-03-01 17:19 ` Mike Frysinger 2012-03-01 23:02 ` Andrew Morton 2 siblings, 0 replies; 8+ messages in thread From: Anton Blanchard @ 2012-03-01 7:12 UTC (permalink / raw) To: benh, paulus, akpm, asharma, vapier, eric.dumazet Cc: linuxppc-dev, linux-kernel Implement atomic_inc_not_zero and atomic64_inc_not_zero. At the moment we use atomic*_add_unless which requires us to put 0 and 1 constants into registers. We can also avoid a subtract by saving the original value in a second temporary. This removes 3 instructions from fget: - c0000000001b63c0: 39 00 00 00 li r8,0 - c0000000001b63c4: 39 40 00 01 li r10,1 ... - c0000000001b63e8: 7c 0a 00 50 subf r0,r10,r0 Signed-off-by: Anton Blanchard <anton@samba.org> --- Index: linux-build/arch/powerpc/include/asm/atomic.h =================================================================== --- linux-build.orig/arch/powerpc/include/asm/atomic.h 2012-02-11 21:42:36.101190317 +1100 +++ linux-build/arch/powerpc/include/asm/atomic.h 2012-02-11 21:58:46.102791345 +1100 @@ -212,6 +212,36 @@ static __inline__ int __atomic_add_unles return t; } +/** + * atomic_inc_not_zero - increment unless the number is zero + * @v: pointer of type atomic_t + * + * Atomically increments @v by 1, so long as @v is non-zero. + * Returns non-zero if @v was non-zero, and zero otherwise. + */ +static __inline__ int atomic_inc_not_zero(atomic_t *v) +{ + int t1, t2; + + __asm__ __volatile__ ( + PPC_ATOMIC_ENTRY_BARRIER +"1: lwarx %0,0,%2 # atomic_inc_not_zero\n\ + cmpwi 0,%0,0\n\ + beq- 2f\n\ + addic %1,%0,1\n" + PPC405_ERR77(0,%2) +" stwcx. %1,0,%2\n\ + bne- 1b\n" + PPC_ATOMIC_EXIT_BARRIER + "\n\ +2:" + : "=&r" (t1), "=&r" (t2) + : "r" (&v->counter) + : "cc", "xer", "memory"); + + return t1; +} +#define atomic_inc_not_zero(v) atomic_inc_not_zero((v)) #define atomic_sub_and_test(a, v) (atomic_sub_return((a), (v)) == 0) #define atomic_dec_and_test(v) (atomic_dec_return((v)) == 0) @@ -467,7 +497,34 @@ static __inline__ int atomic64_add_unles return t != u; } -#define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0) +/** + * atomic_inc64_not_zero - increment unless the number is zero + * @v: pointer of type atomic64_t + * + * Atomically increments @v by 1, so long as @v is non-zero. + * Returns non-zero if @v was non-zero, and zero otherwise. + */ +static __inline__ long atomic64_inc_not_zero(atomic64_t *v) +{ + long t1, t2; + + __asm__ __volatile__ ( + PPC_ATOMIC_ENTRY_BARRIER +"1: ldarx %0,0,%2 # atomic64_inc_not_zero\n\ + cmpdi 0,%0,0\n\ + beq- 2f\n\ + addic %1,%0,1\n\ + stdcx. %1,0,%2\n\ + bne- 1b\n" + PPC_ATOMIC_EXIT_BARRIER + "\n\ +2:" + : "=&r" (t1), "=&r" (t2) + : "r" (&v->counter) + : "cc", "xer", "memory"); + + return t1; +} #endif /* __powerpc64__ */ ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] atomic: Allow atomic_inc_not_zero to be overridden 2012-03-01 7:09 [PATCH 1/2] atomic: Allow atomic_inc_not_zero to be overridden Anton Blanchard @ 2012-03-01 17:19 ` Mike Frysinger 2012-03-01 17:19 ` Mike Frysinger 2012-03-01 23:02 ` Andrew Morton 2 siblings, 0 replies; 8+ messages in thread From: Mike Frysinger @ 2012-03-01 17:19 UTC (permalink / raw) To: Anton Blanchard Cc: eric.dumazet, linux-kernel, paulus, akpm, linuxppc-dev, asharma [-- Attachment #1: Type: Text/Plain, Size: 236 bytes --] On Thursday 01 March 2012 02:09:53 Anton Blanchard wrote: > We want to implement a ppc64 specific version of atomic_inc_not_zero > so wrap it in an ifdef to allow it to be overridden. Acked-by: Mike Frysinger <vapier@gentoo.org> -mike [-- Attachment #2: This is a digitally signed message part. --] [-- Type: application/pgp-signature, Size: 836 bytes --] ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] atomic: Allow atomic_inc_not_zero to be overridden @ 2012-03-01 17:19 ` Mike Frysinger 0 siblings, 0 replies; 8+ messages in thread From: Mike Frysinger @ 2012-03-01 17:19 UTC (permalink / raw) To: Anton Blanchard Cc: benh, paulus, akpm, asharma, eric.dumazet, linuxppc-dev, linux-kernel [-- Attachment #1: Type: Text/Plain, Size: 236 bytes --] On Thursday 01 March 2012 02:09:53 Anton Blanchard wrote: > We want to implement a ppc64 specific version of atomic_inc_not_zero > so wrap it in an ifdef to allow it to be overridden. Acked-by: Mike Frysinger <vapier@gentoo.org> -mike [-- Attachment #2: This is a digitally signed message part. --] [-- Type: application/pgp-signature, Size: 836 bytes --] ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] atomic: Allow atomic_inc_not_zero to be overridden 2012-03-01 7:09 [PATCH 1/2] atomic: Allow atomic_inc_not_zero to be overridden Anton Blanchard @ 2012-03-01 23:02 ` Andrew Morton 2012-03-01 17:19 ` Mike Frysinger 2012-03-01 23:02 ` Andrew Morton 2 siblings, 0 replies; 8+ messages in thread From: Andrew Morton @ 2012-03-01 23:02 UTC (permalink / raw) To: Anton Blanchard Cc: benh, paulus, asharma, vapier, eric.dumazet, linuxppc-dev, linux-kernel, Richard Kuo, linux-hexagon On Thu, 1 Mar 2012 18:09:53 +1100 Anton Blanchard <anton@samba.org> wrote: > > We want to implement a ppc64 specific version of atomic_inc_not_zero > so wrap it in an ifdef to allow it to be overridden. > > Signed-off-by: Anton Blanchard <anton@samba.org> > --- > > Index: linux-build/include/linux/atomic.h > =================================================================== > --- linux-build.orig/include/linux/atomic.h 2012-02-11 14:59:23.284714257 +1100 > +++ linux-build/include/linux/atomic.h 2012-02-11 15:01:14.894764555 +1100 > @@ -24,7 +24,9 @@ static inline int atomic_add_unless(atom > * Atomically increments @v by 1, so long as @v is non-zero. > * Returns non-zero if @v was non-zero, and zero otherwise. > */ > +#ifndef atomic_inc_not_zero > #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) > +#endif Please merge this via the ppc tree? And let's ask the hexagon maintainers to take a look at the definition in arch/hexagon/include/asm/atomic.h. I assume that it can be removed, but that might cause problems with files which include asm/atomic.h directly. I have found two such files in non-arch code and have queued fixes. There are no such files in arch/hexagon code, so I think it's safe to zap the hexagon definition of atomic_inc_not_zero(). > +static __inline__ int atomic_inc_not_zero(atomic_t *v) Curious: is there a technical reason why ppc uses "__inline__" rather than "inline"? ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] atomic: Allow atomic_inc_not_zero to be overridden @ 2012-03-01 23:02 ` Andrew Morton 0 siblings, 0 replies; 8+ messages in thread From: Andrew Morton @ 2012-03-01 23:02 UTC (permalink / raw) To: Anton Blanchard Cc: vapier, eric.dumazet, linux-kernel, Richard Kuo, paulus, linux-hexagon, linuxppc-dev, asharma On Thu, 1 Mar 2012 18:09:53 +1100 Anton Blanchard <anton@samba.org> wrote: > > We want to implement a ppc64 specific version of atomic_inc_not_zero > so wrap it in an ifdef to allow it to be overridden. > > Signed-off-by: Anton Blanchard <anton@samba.org> > --- > > Index: linux-build/include/linux/atomic.h > =================================================================== > --- linux-build.orig/include/linux/atomic.h 2012-02-11 14:59:23.284714257 +1100 > +++ linux-build/include/linux/atomic.h 2012-02-11 15:01:14.894764555 +1100 > @@ -24,7 +24,9 @@ static inline int atomic_add_unless(atom > * Atomically increments @v by 1, so long as @v is non-zero. > * Returns non-zero if @v was non-zero, and zero otherwise. > */ > +#ifndef atomic_inc_not_zero > #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) > +#endif Please merge this via the ppc tree? And let's ask the hexagon maintainers to take a look at the definition in arch/hexagon/include/asm/atomic.h. I assume that it can be removed, but that might cause problems with files which include asm/atomic.h directly. I have found two such files in non-arch code and have queued fixes. There are no such files in arch/hexagon code, so I think it's safe to zap the hexagon definition of atomic_inc_not_zero(). > +static __inline__ int atomic_inc_not_zero(atomic_t *v) Curious: is there a technical reason why ppc uses "__inline__" rather than "inline"? ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] atomic: Allow atomic_inc_not_zero to be overridden 2012-03-01 23:02 ` Andrew Morton @ 2012-03-01 23:48 ` Richard Kuo -1 siblings, 0 replies; 8+ messages in thread From: Richard Kuo @ 2012-03-01 23:48 UTC (permalink / raw) To: Andrew Morton Cc: Anton Blanchard, benh, paulus, asharma, vapier, eric.dumazet, linuxppc-dev, linux-kernel, linux-hexagon On Thu, Mar 01, 2012 at 03:02:56PM -0800, Andrew Morton wrote: > Please merge this via the ppc tree? > > > And let's ask the hexagon maintainers to take a look at the definition > in arch/hexagon/include/asm/atomic.h. I assume that it can be removed, > but that might cause problems with files which include asm/atomic.h > directly. I have found two such files in non-arch code and have queued > fixes. There are no such files in arch/hexagon code, so I think it's > safe to zap the hexagon definition of atomic_inc_not_zero(). Just tested it; it's safe to zap the Hexagon definition of atomic_inc_not_zero()... I'm fine with this going in through some other tree (still getting mine set up). Thanks, Richard Kuo -- Sent by an employee of the Qualcomm Innovation Center, Inc. The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum. ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] atomic: Allow atomic_inc_not_zero to be overridden @ 2012-03-01 23:48 ` Richard Kuo 0 siblings, 0 replies; 8+ messages in thread From: Richard Kuo @ 2012-03-01 23:48 UTC (permalink / raw) To: Andrew Morton Cc: vapier, eric.dumazet, linux-kernel, paulus, Anton Blanchard, linux-hexagon, linuxppc-dev, asharma On Thu, Mar 01, 2012 at 03:02:56PM -0800, Andrew Morton wrote: > Please merge this via the ppc tree? > > > And let's ask the hexagon maintainers to take a look at the definition > in arch/hexagon/include/asm/atomic.h. I assume that it can be removed, > but that might cause problems with files which include asm/atomic.h > directly. I have found two such files in non-arch code and have queued > fixes. There are no such files in arch/hexagon code, so I think it's > safe to zap the hexagon definition of atomic_inc_not_zero(). Just tested it; it's safe to zap the Hexagon definition of atomic_inc_not_zero()... I'm fine with this going in through some other tree (still getting mine set up). Thanks, Richard Kuo -- Sent by an employee of the Qualcomm Innovation Center, Inc. The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum. ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2012-03-01 23:58 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2012-03-01 7:09 [PATCH 1/2] atomic: Allow atomic_inc_not_zero to be overridden Anton Blanchard 2012-03-01 7:12 ` [PATCH 2/2] powerpc: atomic: Implement atomic*_inc_not_zero Anton Blanchard 2012-03-01 17:19 ` [PATCH 1/2] atomic: Allow atomic_inc_not_zero to be overridden Mike Frysinger 2012-03-01 17:19 ` Mike Frysinger 2012-03-01 23:02 ` Andrew Morton 2012-03-01 23:02 ` Andrew Morton 2012-03-01 23:48 ` Richard Kuo 2012-03-01 23:48 ` Richard Kuo
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.