

Lots of architectures have atomic_add_return() and no atomic_add_negative().

We can implement the latter in terms of the former.


---

 25-akpm/include/asm-alpha/atomic.h     |    2 ++
 25-akpm/include/asm-cris/atomic.h      |    2 ++
 25-akpm/include/asm-h8300/atomic.h     |    1 +
 25-akpm/include/asm-m68knommu/atomic.h |    2 ++
 25-akpm/include/asm-parisc/atomic.h    |    2 ++
 25-akpm/include/asm-ppc64/atomic.h     |    2 ++
 25-akpm/include/asm-sh/atomic.h        |    2 ++
 25-akpm/include/asm-sparc/atomic.h     |    2 ++
 8 files changed, 15 insertions(+)

diff -puN include/asm-ppc64/atomic.h~arch-atomic_add_negative include/asm-ppc64/atomic.h
--- 25/include/asm-ppc64/atomic.h~arch-atomic_add_negative	2004-05-13 01:47:02.000646624 -0700
+++ 25-akpm/include/asm-ppc64/atomic.h	2004-05-13 01:47:02.012644800 -0700
@@ -54,6 +54,8 @@ static __inline__ int atomic_add_return(
 	return t;
 }
 
+#define atomic_add_negative(a, v)	(atomic_add_return((a), (v)) < 0)
+
 static __inline__ void atomic_sub(int a, atomic_t *v)
 {
 	int t;
diff -puN include/asm-alpha/atomic.h~arch-atomic_add_negative include/asm-alpha/atomic.h
--- 25/include/asm-alpha/atomic.h~arch-atomic_add_negative	2004-05-13 01:47:02.001646472 -0700
+++ 25-akpm/include/asm-alpha/atomic.h	2004-05-13 01:47:02.012644800 -0700
@@ -115,6 +115,8 @@ static __inline__ long atomic_add_return
 	return result;
 }
 
+#define atomic_add_negative(a, v)	(atomic_add_return((a), (v)) < 0)
+
 static __inline__ long atomic64_add_return(long i, atomic64_t * v)
 {
 	long temp, result;
diff -puN include/asm-cris/atomic.h~arch-atomic_add_negative include/asm-cris/atomic.h
--- 25/include/asm-cris/atomic.h~arch-atomic_add_negative	2004-05-13 01:47:02.003646168 -0700
+++ 25-akpm/include/asm-cris/atomic.h	2004-05-13 01:47:02.013644648 -0700
@@ -56,6 +56,8 @@ extern __inline__ int atomic_add_return(
 	return retval;
 }
 
+#define atomic_add_negative(a, v)	(atomic_add_return((a), (v)) < 0)
+
 extern __inline__ int atomic_sub_return(int i, volatile atomic_t *v)
 {
 	unsigned long flags;
diff -puN include/asm-h8300/atomic.h~arch-atomic_add_negative include/asm-h8300/atomic.h
--- 25/include/asm-h8300/atomic.h~arch-atomic_add_negative	2004-05-13 01:47:02.004646016 -0700
+++ 25-akpm/include/asm-h8300/atomic.h	2004-05-13 01:47:02.013644648 -0700
@@ -25,6 +25,7 @@ static __inline__ int atomic_add_return(
 }
 
 #define atomic_add(i, v) atomic_add_return(i, v)
+#define atomic_add_negative(a, v)	(atomic_add_return((a), (v)) < 0)
 
 static __inline__ int atomic_sub_return(int i, atomic_t *v)
 {
diff -puN include/asm-m68knommu/atomic.h~arch-atomic_add_negative include/asm-m68knommu/atomic.h
--- 25/include/asm-m68knommu/atomic.h~arch-atomic_add_negative	2004-05-13 01:47:02.005645864 -0700
+++ 25-akpm/include/asm-m68knommu/atomic.h	2004-05-13 01:47:02.013644648 -0700
@@ -96,6 +96,8 @@ extern __inline__ int atomic_add_return(
 	return temp;
 }
 
+#define atomic_add_negative(a, v)	(atomic_add_return((a), (v)) < 0)
+
 extern __inline__ int atomic_sub_return(int i, atomic_t * v)
 {
 	unsigned long temp, flags;
diff -puN include/asm-parisc/atomic.h~arch-atomic_add_negative include/asm-parisc/atomic.h
--- 25/include/asm-parisc/atomic.h~arch-atomic_add_negative	2004-05-13 01:47:02.007645560 -0700
+++ 25-akpm/include/asm-parisc/atomic.h	2004-05-13 01:47:02.014644496 -0700
@@ -185,6 +185,8 @@ static __inline__ int atomic_read(const 
 #define atomic_inc_return(v)	(__atomic_add_return(   1,(v)))
 #define atomic_dec_return(v)	(__atomic_add_return(  -1,(v)))
 
+#define atomic_add_negative(a, v)	(atomic_add_return((a), (v)) < 0)
+
 #define atomic_dec_and_test(v)	(atomic_dec_return(v) == 0)
 
 #define ATOMIC_INIT(i)	{ (i) }
diff -puN include/asm-sh/atomic.h~arch-atomic_add_negative include/asm-sh/atomic.h
--- 25/include/asm-sh/atomic.h~arch-atomic_add_negative	2004-05-13 01:47:02.008645408 -0700
+++ 25-akpm/include/asm-sh/atomic.h	2004-05-13 01:47:02.014644496 -0700
@@ -53,6 +53,8 @@ static __inline__ int atomic_add_return(
 	return temp;
 }
 
+#define atomic_add_negative(a, v)	(atomic_add_return((a), (v)) < 0)
+
 static __inline__ int atomic_sub_return(int i, atomic_t * v)
 {
 	unsigned long temp, flags;
diff -puN include/asm-sparc/atomic.h~arch-atomic_add_negative include/asm-sparc/atomic.h
--- 25/include/asm-sparc/atomic.h~arch-atomic_add_negative	2004-05-13 01:47:02.009645256 -0700
+++ 25-akpm/include/asm-sparc/atomic.h	2004-05-13 01:47:02.015644344 -0700
@@ -33,6 +33,8 @@ extern void atomic_set(atomic_t *, int);
 #define atomic_inc_return(v)	(__atomic_add_return(        1, (v)))
 #define atomic_dec_return(v)	(__atomic_add_return(       -1, (v)))
 
+#define atomic_add_negative(a, v)	(atomic_add_return((a), (v)) < 0)
+
 #define atomic_dec_and_test(v) (atomic_dec_return(v) == 0)
 
 /* This is the old 24-bit implementation.  It's still used internally

_
