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) }
2021-05-25 17:02:09 +03:00
extern s64 generic_atomic64_read ( const atomic64_t * v ) ;
extern void generic_atomic64_set ( atomic64_t * v , s64 i ) ;
2017-06-09 14:05:06 +03:00
2014-04-23 18:12:30 +04:00
# define ATOMIC64_OP(op) \
2021-05-25 17:02:09 +03:00
extern void generic_atomic64_ # # op ( s64 a , atomic64_t * v ) ;
2014-04-23 18:12:30 +04:00
# define ATOMIC64_OP_RETURN(op) \
2021-05-25 17:02:09 +03:00
extern s64 generic_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) \
2021-05-25 17:02:09 +03:00
extern s64 generic_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
2021-05-25 17:02:09 +03:00
extern s64 generic_atomic64_dec_if_positive ( atomic64_t * v ) ;
extern s64 generic_atomic64_cmpxchg ( atomic64_t * v , s64 o , s64 n ) ;
extern s64 generic_atomic64_xchg ( atomic64_t * v , s64 new ) ;
extern s64 generic_atomic64_fetch_add_unless ( atomic64_t * v , s64 a , s64 u ) ;
# define arch_atomic64_read generic_atomic64_read
# define arch_atomic64_set generic_atomic64_set
# define arch_atomic64_set_release generic_atomic64_set
# define arch_atomic64_add generic_atomic64_add
# define arch_atomic64_add_return generic_atomic64_add_return
# define arch_atomic64_fetch_add generic_atomic64_fetch_add
# define arch_atomic64_sub generic_atomic64_sub
# define arch_atomic64_sub_return generic_atomic64_sub_return
# define arch_atomic64_fetch_sub generic_atomic64_fetch_sub
# define arch_atomic64_and generic_atomic64_and
# define arch_atomic64_fetch_and generic_atomic64_fetch_and
# define arch_atomic64_or generic_atomic64_or
# define arch_atomic64_fetch_or generic_atomic64_fetch_or
# define arch_atomic64_xor generic_atomic64_xor
# define arch_atomic64_fetch_xor generic_atomic64_fetch_xor
# define arch_atomic64_dec_if_positive generic_atomic64_dec_if_positive
# define arch_atomic64_cmpxchg generic_atomic64_cmpxchg
# define arch_atomic64_xchg generic_atomic64_xchg
# define arch_atomic64_fetch_add_unless generic_atomic64_fetch_add_unless
2009-06-13 01:10:05 +04:00
# endif /* _ASM_GENERIC_ATOMIC64_H */