ff5b4f1ed5
We'd like all architectures to convert to ARCH_ATOMIC, as once all architectures are converted it will be possible to make significant cleanups to the atomics headers, and this will make it much easier to generically enable atomic functionality (e.g. debug logic in the instrumented wrappers). As a step towards that, this patch migrates sparc to ARCH_ATOMIC. The arch code provides arch_{atomic,atomic64,xchg,cmpxchg}*(), and common code wraps these with optional instrumentation to provide the regular functions. Signed-off-by: Mark Rutland <mark.rutland@arm.com> Cc: "David S. Miller" <davem@davemloft.net> Cc: Boqun Feng <boqun.feng@gmail.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Will Deacon <will@kernel.org> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Link: https://lore.kernel.org/r/20210525140232.53872-31-mark.rutland@arm.com
48 lines
1.7 KiB
C
48 lines
1.7 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/* atomic.h: These still suck, but the I-cache hit rate is higher.
|
|
*
|
|
* Copyright (C) 1996 David S. Miller (davem@davemloft.net)
|
|
* Copyright (C) 2000 Anton Blanchard (anton@linuxcare.com.au)
|
|
* Copyright (C) 2007 Kyle McMartin (kyle@parisc-linux.org)
|
|
*
|
|
* Additions by Keith M Wesolowski (wesolows@foobazco.org) based
|
|
* on asm-parisc/atomic.h Copyright (C) 2000 Philipp Rumpf <prumpf@tux.org>.
|
|
*/
|
|
|
|
#ifndef __ARCH_SPARC_ATOMIC__
|
|
#define __ARCH_SPARC_ATOMIC__
|
|
|
|
#include <linux/types.h>
|
|
|
|
#include <asm/cmpxchg.h>
|
|
#include <asm/barrier.h>
|
|
#include <asm-generic/atomic64.h>
|
|
|
|
int arch_atomic_add_return(int, atomic_t *);
|
|
int arch_atomic_fetch_add(int, atomic_t *);
|
|
int arch_atomic_fetch_and(int, atomic_t *);
|
|
int arch_atomic_fetch_or(int, atomic_t *);
|
|
int arch_atomic_fetch_xor(int, atomic_t *);
|
|
int arch_atomic_cmpxchg(atomic_t *, int, int);
|
|
int arch_atomic_xchg(atomic_t *, int);
|
|
int arch_atomic_fetch_add_unless(atomic_t *, int, int);
|
|
void arch_atomic_set(atomic_t *, int);
|
|
|
|
#define arch_atomic_fetch_add_unless arch_atomic_fetch_add_unless
|
|
|
|
#define arch_atomic_set_release(v, i) arch_atomic_set((v), (i))
|
|
|
|
#define arch_atomic_read(v) READ_ONCE((v)->counter)
|
|
|
|
#define arch_atomic_add(i, v) ((void)arch_atomic_add_return( (int)(i), (v)))
|
|
#define arch_atomic_sub(i, v) ((void)arch_atomic_add_return(-(int)(i), (v)))
|
|
|
|
#define arch_atomic_and(i, v) ((void)arch_atomic_fetch_and((i), (v)))
|
|
#define arch_atomic_or(i, v) ((void)arch_atomic_fetch_or((i), (v)))
|
|
#define arch_atomic_xor(i, v) ((void)arch_atomic_fetch_xor((i), (v)))
|
|
|
|
#define arch_atomic_sub_return(i, v) (arch_atomic_add_return(-(int)(i), (v)))
|
|
#define arch_atomic_fetch_sub(i, v) (arch_atomic_fetch_add (-(int)(i), (v)))
|
|
|
|
#endif /* !(__ARCH_SPARC_ATOMIC__) */
|