2019-05-27 09:55:01 +03:00
/* SPDX-License-Identifier: GPL-2.0-or-later */
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 >
*/
# ifndef _ASM_GENERIC_ATOMIC64_H
# define _ASM_GENERIC_ATOMIC64_H
2018-06-21 15:13:07 +03:00
# include <linux/types.h>
2009-06-13 01:10:05 +04:00
typedef struct {
2019-05-22 16:22:35 +03:00
s64 counter ;
2009-06-13 01:10:05 +04:00
} atomic64_t ;
# define ATOMIC64_INIT(i) { (i) }
2019-05-22 16:22:35 +03:00
extern s64 atomic64_read ( const atomic64_t * v ) ;
extern void atomic64_set ( atomic64_t * v , s64 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) \
2019-05-22 16:22:35 +03:00
extern void atomic64_ # # op ( s64 a , atomic64_t * v ) ;
2014-04-23 18:12:30 +04:00
# define ATOMIC64_OP_RETURN(op) \
2019-05-22 16:22:35 +03:00
extern s64 atomic64_ # # op # # _return ( s64 a , atomic64_t * v ) ;
2014-04-23 18:12:30 +04:00
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) \
2019-05-22 16:22:35 +03:00
extern s64 atomic64_fetch_ # # op ( s64 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_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
2019-05-22 16:22:35 +03:00
extern s64 atomic64_dec_if_positive ( atomic64_t * v ) ;
2018-06-21 15:13:20 +03:00
# define atomic64_dec_if_positive atomic64_dec_if_positive
2019-05-22 16:22:35 +03:00
extern s64 atomic64_cmpxchg ( atomic64_t * v , s64 o , s64 n ) ;
extern s64 atomic64_xchg ( atomic64_t * v , s64 new ) ;
extern s64 atomic64_fetch_add_unless ( atomic64_t * v , s64 a , s64 u ) ;
2018-06-21 15:13:11 +03:00
# define atomic64_fetch_add_unless atomic64_fetch_add_unless
2009-06-13 01:10:05 +04:00
# endif /* _ASM_GENERIC_ATOMIC64_H */