2009-06-13 01:10:05 +04:00
/*
* Generic implementation of 64 - bit atomics using spinlocks ,
* useful on processors that don ' t have 64 - bit atomic instructions .
*
* Copyright © 2009 Paul Mackerras , IBM Corp . < paulus @ au1 . ibm . com >
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version
* 2 of the License , or ( at your option ) any later version .
*/
# ifndef _ASM_GENERIC_ATOMIC64_H
# define _ASM_GENERIC_ATOMIC64_H
typedef struct {
long long counter ;
} atomic64_t ;
# define ATOMIC64_INIT(i) { (i) }
extern long long atomic64_read ( const atomic64_t * v ) ;
extern void atomic64_set ( atomic64_t * v , long long i ) ;
2014-04-23 18:12:30 +04:00
2017-06-09 14:05:06 +03:00
# define atomic64_set_release(v, i) atomic64_set((v), (i))
2014-04-23 18:12:30 +04:00
# define ATOMIC64_OP(op) \
extern void atomic64_ # # op ( long long a , atomic64_t * v ) ;
# define ATOMIC64_OP_RETURN(op) \
extern long long atomic64_ # # op # # _return ( long long a , atomic64_t * v ) ;
locking/atomic: Implement atomic{,64,_long}_fetch_{add,sub,and,andnot,or,xor}{,_relaxed,_acquire,_release}()
Now that all the architectures have implemented support for these new
atomic primitives add on the generic infrastructure to expose and use
it.
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Boqun Feng <boqun.feng@gmail.com>
Cc: Borislav Petkov <bp@suse.de>
Cc: Davidlohr Bueso <dave@stgolabs.net>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Will Deacon <will.deacon@arm.com>
Cc: linux-arch@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
2016-04-18 01:54:38 +03:00
# define ATOMIC64_FETCH_OP(op) \
extern long long atomic64_fetch_ # # op ( long long a , atomic64_t * v ) ;
# define ATOMIC64_OPS(op) ATOMIC64_OP(op) ATOMIC64_OP_RETURN(op) ATOMIC64_FETCH_OP(op)
2014-04-23 18:12:30 +04:00
ATOMIC64_OPS ( add )
ATOMIC64_OPS ( sub )
locking/atomic: Implement atomic{,64,_long}_fetch_{add,sub,and,andnot,or,xor}{,_relaxed,_acquire,_release}()
Now that all the architectures have implemented support for these new
atomic primitives add on the generic infrastructure to expose and use
it.
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Boqun Feng <boqun.feng@gmail.com>
Cc: Borislav Petkov <bp@suse.de>
Cc: Davidlohr Bueso <dave@stgolabs.net>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Will Deacon <will.deacon@arm.com>
Cc: linux-arch@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
2016-04-18 01:54:38 +03:00
# undef ATOMIC64_OPS
# define ATOMIC64_OPS(op) ATOMIC64_OP(op) ATOMIC64_FETCH_OP(op)
ATOMIC64_OPS ( and )
ATOMIC64_OPS ( or )
ATOMIC64_OPS ( xor )
2014-04-23 21:32:50 +04:00
2014-04-23 18:12:30 +04:00
# undef ATOMIC64_OPS
locking/atomic: Implement atomic{,64,_long}_fetch_{add,sub,and,andnot,or,xor}{,_relaxed,_acquire,_release}()
Now that all the architectures have implemented support for these new
atomic primitives add on the generic infrastructure to expose and use
it.
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Boqun Feng <boqun.feng@gmail.com>
Cc: Borislav Petkov <bp@suse.de>
Cc: Davidlohr Bueso <dave@stgolabs.net>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Will Deacon <will.deacon@arm.com>
Cc: linux-arch@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
2016-04-18 01:54:38 +03:00
# undef ATOMIC64_FETCH_OP
2014-04-23 18:12:30 +04:00
# undef ATOMIC64_OP_RETURN
# undef ATOMIC64_OP
2009-06-13 01:10:05 +04:00
extern long long atomic64_dec_if_positive ( atomic64_t * v ) ;
extern long long atomic64_cmpxchg ( atomic64_t * v , long long o , long long n ) ;
extern long long atomic64_xchg ( atomic64_t * v , long long new ) ;
extern int atomic64_add_unless ( atomic64_t * v , long long a , long long u ) ;
# define atomic64_add_negative(a, v) (atomic64_add_return((a), (v)) < 0)
# define atomic64_inc(v) atomic64_add(1LL, (v))
# define atomic64_inc_return(v) atomic64_add_return(1LL, (v))
# define atomic64_inc_and_test(v) (atomic64_inc_return(v) == 0)
# define atomic64_sub_and_test(a, v) (atomic64_sub_return((a), (v)) == 0)
# define atomic64_dec(v) atomic64_sub(1LL, (v))
# define atomic64_dec_return(v) atomic64_sub_return(1LL, (v))
# define atomic64_dec_and_test(v) (atomic64_dec_return((v)) == 0)
# define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1LL, 0LL)
# endif /* _ASM_GENERIC_ATOMIC64_H */