개념 설명 전체 · v6.18.37 / arch/arm64/include/asm/atomic.h

    1 /* SPDX-License-Identifier: GPL-2.0-only */
    2 /*
    3  * Based on arch/arm/include/asm/atomic.h
    4  *
    5  * Copyright (C) 1996 Russell King.
    6  * Copyright (C) 2002 Deep Blue Solutions Ltd.
    7  * Copyright (C) 2012 ARM Ltd.
    8  */
    9 #ifndef __ASM_ATOMIC_H
   10 #define __ASM_ATOMIC_H
   11 
   12 #include <linux/compiler.h>
   13 #include <linux/types.h>
   14 
   15 #include <asm/barrier.h>
   16 #include <asm/cmpxchg.h>
   17 #include <asm/lse.h>
   18 
   19 #define ATOMIC_OP(op)							\
   20 static __always_inline void arch_##op(int i, atomic_t *v)		\
   21 {									\
   22 	__lse_ll_sc_body(op, i, v);					\
   23 }
   24 
   25 ATOMIC_OP(atomic_andnot)
   26 ATOMIC_OP(atomic_or)
   27 ATOMIC_OP(atomic_xor)
   28 ATOMIC_OP(atomic_add)
   29 ATOMIC_OP(atomic_and)
   30 ATOMIC_OP(atomic_sub)
   31 
   32 #undef ATOMIC_OP
   33 
   34 #define ATOMIC_FETCH_OP(name, op)					\
   35 static __always_inline int arch_##op##name(int i, atomic_t *v)		\
   36 {									\
   37 	return __lse_ll_sc_body(op##name, i, v);			\
   38 }
   39 
   40 #define ATOMIC_FETCH_OPS(op)						\
   41 	ATOMIC_FETCH_OP(_relaxed, op)					\
   42 	ATOMIC_FETCH_OP(_acquire, op)					\
   43 	ATOMIC_FETCH_OP(_release, op)					\
   44 	ATOMIC_FETCH_OP(        , op)
   45 
   46 ATOMIC_FETCH_OPS(atomic_fetch_andnot)
   47 ATOMIC_FETCH_OPS(atomic_fetch_or)
   48 ATOMIC_FETCH_OPS(atomic_fetch_xor)
   49 ATOMIC_FETCH_OPS(atomic_fetch_add)
   50 ATOMIC_FETCH_OPS(atomic_fetch_and)
   51 ATOMIC_FETCH_OPS(atomic_fetch_sub)
   52 ATOMIC_FETCH_OPS(atomic_add_return)
   53 ATOMIC_FETCH_OPS(atomic_sub_return)
   54 
   55 #undef ATOMIC_FETCH_OP
   56 #undef ATOMIC_FETCH_OPS
   57 
   58 #define ATOMIC64_OP(op)							\
   59 static __always_inline void arch_##op(long i, atomic64_t *v)		\
   60 {									\
   61 	__lse_ll_sc_body(op, i, v);					\
   62 }
   63 
   64 ATOMIC64_OP(atomic64_andnot)
   65 ATOMIC64_OP(atomic64_or)
   66 ATOMIC64_OP(atomic64_xor)
   67 ATOMIC64_OP(atomic64_add)
   68 ATOMIC64_OP(atomic64_and)
   69 ATOMIC64_OP(atomic64_sub)
   70 
   71 #undef ATOMIC64_OP
   72 
   73 #define ATOMIC64_FETCH_OP(name, op)					\
   74 static __always_inline long arch_##op##name(long i, atomic64_t *v)	\
   75 {									\
   76 	return __lse_ll_sc_body(op##name, i, v);			\
   77 }
   78 
   79 #define ATOMIC64_FETCH_OPS(op)						\
   80 	ATOMIC64_FETCH_OP(_relaxed, op)					\
   81 	ATOMIC64_FETCH_OP(_acquire, op)					\
   82 	ATOMIC64_FETCH_OP(_release, op)					\
   83 	ATOMIC64_FETCH_OP(        , op)
   84 
   85 ATOMIC64_FETCH_OPS(atomic64_fetch_andnot)
   86 ATOMIC64_FETCH_OPS(atomic64_fetch_or)
   87 ATOMIC64_FETCH_OPS(atomic64_fetch_xor)
   88 ATOMIC64_FETCH_OPS(atomic64_fetch_add)
   89 ATOMIC64_FETCH_OPS(atomic64_fetch_and)
   90 ATOMIC64_FETCH_OPS(atomic64_fetch_sub)
   91 ATOMIC64_FETCH_OPS(atomic64_add_return)
   92 ATOMIC64_FETCH_OPS(atomic64_sub_return)
   93 
   94 #undef ATOMIC64_FETCH_OP
   95 #undef ATOMIC64_FETCH_OPS
   96 
   97 static __always_inline long arch_atomic64_dec_if_positive(atomic64_t *v)
   98 {
   99 	return __lse_ll_sc_body(atomic64_dec_if_positive, v);
  100 }
  101 
  102 #define arch_atomic_read(v)			__READ_ONCE((v)->counter)
  103 #define arch_atomic_set(v, i)			__WRITE_ONCE(((v)->counter), (i))
  104 
  105 #define arch_atomic_add_return_relaxed		arch_atomic_add_return_relaxed
  106 #define arch_atomic_add_return_acquire		arch_atomic_add_return_acquire
  107 #define arch_atomic_add_return_release		arch_atomic_add_return_release
  108 #define arch_atomic_add_return			arch_atomic_add_return
  109 
  110 #define arch_atomic_sub_return_relaxed		arch_atomic_sub_return_relaxed
  111 #define arch_atomic_sub_return_acquire		arch_atomic_sub_return_acquire
  112 #define arch_atomic_sub_return_release		arch_atomic_sub_return_release
  113 #define arch_atomic_sub_return			arch_atomic_sub_return
  114 
  115 #define arch_atomic_fetch_add_relaxed		arch_atomic_fetch_add_relaxed
  116 #define arch_atomic_fetch_add_acquire		arch_atomic_fetch_add_acquire
  117 #define arch_atomic_fetch_add_release		arch_atomic_fetch_add_release
  118 #define arch_atomic_fetch_add			arch_atomic_fetch_add
  119 
  120 #define arch_atomic_fetch_sub_relaxed		arch_atomic_fetch_sub_relaxed
  121 #define arch_atomic_fetch_sub_acquire		arch_atomic_fetch_sub_acquire
  122 #define arch_atomic_fetch_sub_release		arch_atomic_fetch_sub_release
  123 #define arch_atomic_fetch_sub			arch_atomic_fetch_sub
  124 
  125 #define arch_atomic_fetch_and_relaxed		arch_atomic_fetch_and_relaxed
  126 #define arch_atomic_fetch_and_acquire		arch_atomic_fetch_and_acquire
  127 #define arch_atomic_fetch_and_release		arch_atomic_fetch_and_release
  128 #define arch_atomic_fetch_and			arch_atomic_fetch_and
  129 
  130 #define arch_atomic_fetch_andnot_relaxed	arch_atomic_fetch_andnot_relaxed
  131 #define arch_atomic_fetch_andnot_acquire	arch_atomic_fetch_andnot_acquire
  132 #define arch_atomic_fetch_andnot_release	arch_atomic_fetch_andnot_release
  133 #define arch_atomic_fetch_andnot		arch_atomic_fetch_andnot
  134 
  135 #define arch_atomic_fetch_or_relaxed		arch_atomic_fetch_or_relaxed
  136 #define arch_atomic_fetch_or_acquire		arch_atomic_fetch_or_acquire
  137 #define arch_atomic_fetch_or_release		arch_atomic_fetch_or_release
  138 #define arch_atomic_fetch_or			arch_atomic_fetch_or
  139 
  140 #define arch_atomic_fetch_xor_relaxed		arch_atomic_fetch_xor_relaxed
  141 #define arch_atomic_fetch_xor_acquire		arch_atomic_fetch_xor_acquire
  142 #define arch_atomic_fetch_xor_release		arch_atomic_fetch_xor_release
  143 #define arch_atomic_fetch_xor			arch_atomic_fetch_xor
  144 
  145 #define arch_atomic_andnot			arch_atomic_andnot
  146 
  147 /*
  148  * 64-bit arch_atomic operations.
  149  */
  150 #define ATOMIC64_INIT				ATOMIC_INIT
  151 #define arch_atomic64_read			arch_atomic_read
  152 #define arch_atomic64_set			arch_atomic_set
  153 
  154 #define arch_atomic64_add_return_relaxed	arch_atomic64_add_return_relaxed
  155 #define arch_atomic64_add_return_acquire	arch_atomic64_add_return_acquire
  156 #define arch_atomic64_add_return_release	arch_atomic64_add_return_release
  157 #define arch_atomic64_add_return		arch_atomic64_add_return
  158 
  159 #define arch_atomic64_sub_return_relaxed	arch_atomic64_sub_return_relaxed
  160 #define arch_atomic64_sub_return_acquire	arch_atomic64_sub_return_acquire
  161 #define arch_atomic64_sub_return_release	arch_atomic64_sub_return_release
  162 #define arch_atomic64_sub_return		arch_atomic64_sub_return
  163 
  164 #define arch_atomic64_fetch_add_relaxed		arch_atomic64_fetch_add_relaxed
  165 #define arch_atomic64_fetch_add_acquire		arch_atomic64_fetch_add_acquire
  166 #define arch_atomic64_fetch_add_release		arch_atomic64_fetch_add_release
  167 #define arch_atomic64_fetch_add			arch_atomic64_fetch_add
  168 
  169 #define arch_atomic64_fetch_sub_relaxed		arch_atomic64_fetch_sub_relaxed
  170 #define arch_atomic64_fetch_sub_acquire		arch_atomic64_fetch_sub_acquire
  171 #define arch_atomic64_fetch_sub_release		arch_atomic64_fetch_sub_release
  172 #define arch_atomic64_fetch_sub			arch_atomic64_fetch_sub
  173 
  174 #define arch_atomic64_fetch_and_relaxed		arch_atomic64_fetch_and_relaxed
  175 #define arch_atomic64_fetch_and_acquire		arch_atomic64_fetch_and_acquire
  176 #define arch_atomic64_fetch_and_release		arch_atomic64_fetch_and_release
  177 #define arch_atomic64_fetch_and			arch_atomic64_fetch_and
  178 
  179 #define arch_atomic64_fetch_andnot_relaxed	arch_atomic64_fetch_andnot_relaxed
  180 #define arch_atomic64_fetch_andnot_acquire	arch_atomic64_fetch_andnot_acquire
  181 #define arch_atomic64_fetch_andnot_release	arch_atomic64_fetch_andnot_release
  182 #define arch_atomic64_fetch_andnot		arch_atomic64_fetch_andnot
  183 
  184 #define arch_atomic64_fetch_or_relaxed		arch_atomic64_fetch_or_relaxed
  185 #define arch_atomic64_fetch_or_acquire		arch_atomic64_fetch_or_acquire
  186 #define arch_atomic64_fetch_or_release		arch_atomic64_fetch_or_release
  187 #define arch_atomic64_fetch_or			arch_atomic64_fetch_or
  188 
  189 #define arch_atomic64_fetch_xor_relaxed		arch_atomic64_fetch_xor_relaxed
  190 #define arch_atomic64_fetch_xor_acquire		arch_atomic64_fetch_xor_acquire
  191 #define arch_atomic64_fetch_xor_release		arch_atomic64_fetch_xor_release
  192 #define arch_atomic64_fetch_xor			arch_atomic64_fetch_xor
  193 
  194 #define arch_atomic64_andnot			arch_atomic64_andnot
  195 
  196 #define arch_atomic64_dec_if_positive		arch_atomic64_dec_if_positive
  197 
  198 #endif /* __ASM_ATOMIC_H */