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 _