linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
* [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; 5+ 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] 5+ 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 ` [PATCH 1/2] atomic: Allow atomic_inc_not_zero to be overridden Mike Frysinger
  2012-03-01 23:02 ` Andrew Morton
  2 siblings, 0 replies; 5+ 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] 5+ 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  7:12 ` [PATCH 2/2] powerpc: atomic: Implement atomic*_inc_not_zero Anton Blanchard
@ 2012-03-01 17:19 ` Mike Frysinger
  2012-03-01 23:02 ` Andrew Morton
  2 siblings, 0 replies; 5+ 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] 5+ 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  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 23:02 ` Andrew Morton
  2012-03-01 23:48   ` Richard Kuo
  2 siblings, 1 reply; 5+ 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] 5+ 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
  0 siblings, 0 replies; 5+ 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] 5+ messages in thread

end of thread, other threads:[~2012-03-01 23:58 UTC | newest]

Thread overview: 5+ 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 23:02 ` Andrew Morton
2012-03-01 23:48   ` Richard Kuo

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).