--- linux-2.6.8.1/include/asm-arm/atomic.h 2004-08-14 19:54:50.000000000 +0900 +++ linux-2.6.8.1.rcu/include/asm-arm/atomic.h 2004-08-24 19:31:56.000000000 +0900 @@ -194,8 +194,10 @@ #define atomic_dec(v) atomic_sub(1, v) #define atomic_inc_and_test(v) (atomic_add_return(1, v) == 0) #define atomic_dec_and_test(v) (atomic_sub_return(1, v) == 0) +#define atomic_inc_return(v) (atomic_add_return(1, v)) +#define atomic_dec_return(v) (atomic_sub_return(1, v)) #define atomic_add_negative(i,v) (atomic_add_return(i, v) < 0) /* Atomic operations are already serializing on ARM */ --- linux-2.6.8.1/include/asm-i386/atomic.h 2004-08-14 19:55:09.000000000 +0900 +++ linux-2.6.8.1.rcu/include/asm-i386/atomic.h 2004-08-25 11:57:08.000000000 +0900 @@ -175,8 +175,34 @@ :"ir" (i), "m" (v->counter) : "memory"); return c; } +/** + * atomic_add_return - add and return + * @v: pointer of type atomic_t + * @i: integer value to add + * + * Atomically adds @i to @v and returns @i + @v + */ +static __inline__ int atomic_add_return(int i, atomic_t *v) +{ + /* NOTICE: This function can be used on i486+ */ + int __i = i; + __asm__ __volatile__( + LOCK "xaddl %0, %1;" + :"=r"(i) + :"m"(v->counter), "0"(i)); + return i + __i; +} + +static __inline__ int atomic_sub_return(int i, atomic_t *v) +{ + return atomic_add_return(-i,v); +} + +#define atomic_inc_return(v) (atomic_add_return(1,v)) +#define atomic_dec_return(v) (atomic_sub_return(1,v)) + /* These are x86-specific, used by some header files */ #define atomic_clear_mask(mask, addr) \ __asm__ __volatile__(LOCK "andl %0,%1" \ : : "r" (~(mask)),"m" (*addr) : "memory") --- linux-2.6.8.1/include/asm-x86_64/atomic.h 2004-08-14 19:56:23.000000000 +0900 +++ linux-2.6.8.1.rcu/include/asm-x86_64/atomic.h 2004-08-25 11:57:36.000000000 +0900 @@ -177,8 +177,33 @@ :"ir" (i), "m" (v->counter) : "memory"); return c; } +/** + * atomic_add_return - add and return + * @v: pointer of type atomic_t + * @i: integer value to add + * + * Atomically adds @i to @v and returns @i + @v + */ +static __inline__ int atomic_add_return(int i, atomic_t *v) +{ + int __i = i; + __asm__ __volatile__( + LOCK "xaddl %0, %1;" + :"=r"(i) + :"m"(v->counter), "0"(i)); + return i + __i; +} + +static __inline__ int atomic_sub_return(int i, atomic_t *v) +{ + return atomic_add_return(-i,v); +} + +#define atomic_inc_return(v) (atomic_add_return(1,v)) +#define atomic_dec_return(v) (atomic_sub_return(1,v)) + /* These are x86-specific, used by some header files */ #define atomic_clear_mask(mask, addr) \ __asm__ __volatile__(LOCK "andl %0,%1" \ : : "r" (~(mask)),"m" (*addr) : "memory")