0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #ifndef __ASM_GENERIC_BARRIER_H
0012 #define __ASM_GENERIC_BARRIER_H
0013
0014 #ifndef __ASSEMBLY__
0015
0016 #include <linux/compiler.h>
0017 #include <linux/kcsan-checks.h>
0018 #include <asm/rwonce.h>
0019
0020 #ifndef nop
0021 #define nop() asm volatile ("nop")
0022 #endif
0023
0024
0025
0026
0027
0028
0029 #ifdef __mb
0030 #define mb() do { kcsan_mb(); __mb(); } while (0)
0031 #endif
0032
0033 #ifdef __rmb
0034 #define rmb() do { kcsan_rmb(); __rmb(); } while (0)
0035 #endif
0036
0037 #ifdef __wmb
0038 #define wmb() do { kcsan_wmb(); __wmb(); } while (0)
0039 #endif
0040
0041 #ifdef __dma_mb
0042 #define dma_mb() do { kcsan_mb(); __dma_mb(); } while (0)
0043 #endif
0044
0045 #ifdef __dma_rmb
0046 #define dma_rmb() do { kcsan_rmb(); __dma_rmb(); } while (0)
0047 #endif
0048
0049 #ifdef __dma_wmb
0050 #define dma_wmb() do { kcsan_wmb(); __dma_wmb(); } while (0)
0051 #endif
0052
0053
0054
0055
0056
0057
0058
0059
0060 #ifndef mb
0061 #define mb() barrier()
0062 #endif
0063
0064 #ifndef rmb
0065 #define rmb() mb()
0066 #endif
0067
0068 #ifndef wmb
0069 #define wmb() mb()
0070 #endif
0071
0072 #ifndef dma_mb
0073 #define dma_mb() mb()
0074 #endif
0075
0076 #ifndef dma_rmb
0077 #define dma_rmb() rmb()
0078 #endif
0079
0080 #ifndef dma_wmb
0081 #define dma_wmb() wmb()
0082 #endif
0083
0084 #ifndef __smp_mb
0085 #define __smp_mb() mb()
0086 #endif
0087
0088 #ifndef __smp_rmb
0089 #define __smp_rmb() rmb()
0090 #endif
0091
0092 #ifndef __smp_wmb
0093 #define __smp_wmb() wmb()
0094 #endif
0095
0096 #ifdef CONFIG_SMP
0097
0098 #ifndef smp_mb
0099 #define smp_mb() do { kcsan_mb(); __smp_mb(); } while (0)
0100 #endif
0101
0102 #ifndef smp_rmb
0103 #define smp_rmb() do { kcsan_rmb(); __smp_rmb(); } while (0)
0104 #endif
0105
0106 #ifndef smp_wmb
0107 #define smp_wmb() do { kcsan_wmb(); __smp_wmb(); } while (0)
0108 #endif
0109
0110 #else
0111
0112 #ifndef smp_mb
0113 #define smp_mb() barrier()
0114 #endif
0115
0116 #ifndef smp_rmb
0117 #define smp_rmb() barrier()
0118 #endif
0119
0120 #ifndef smp_wmb
0121 #define smp_wmb() barrier()
0122 #endif
0123
0124 #endif
0125
0126 #ifndef __smp_store_mb
0127 #define __smp_store_mb(var, value) do { WRITE_ONCE(var, value); __smp_mb(); } while (0)
0128 #endif
0129
0130 #ifndef __smp_mb__before_atomic
0131 #define __smp_mb__before_atomic() __smp_mb()
0132 #endif
0133
0134 #ifndef __smp_mb__after_atomic
0135 #define __smp_mb__after_atomic() __smp_mb()
0136 #endif
0137
0138 #ifndef __smp_store_release
0139 #define __smp_store_release(p, v) \
0140 do { \
0141 compiletime_assert_atomic_type(*p); \
0142 __smp_mb(); \
0143 WRITE_ONCE(*p, v); \
0144 } while (0)
0145 #endif
0146
0147 #ifndef __smp_load_acquire
0148 #define __smp_load_acquire(p) \
0149 ({ \
0150 __unqual_scalar_typeof(*p) ___p1 = READ_ONCE(*p); \
0151 compiletime_assert_atomic_type(*p); \
0152 __smp_mb(); \
0153 (typeof(*p))___p1; \
0154 })
0155 #endif
0156
0157 #ifdef CONFIG_SMP
0158
0159 #ifndef smp_store_mb
0160 #define smp_store_mb(var, value) do { kcsan_mb(); __smp_store_mb(var, value); } while (0)
0161 #endif
0162
0163 #ifndef smp_mb__before_atomic
0164 #define smp_mb__before_atomic() do { kcsan_mb(); __smp_mb__before_atomic(); } while (0)
0165 #endif
0166
0167 #ifndef smp_mb__after_atomic
0168 #define smp_mb__after_atomic() do { kcsan_mb(); __smp_mb__after_atomic(); } while (0)
0169 #endif
0170
0171 #ifndef smp_store_release
0172 #define smp_store_release(p, v) do { kcsan_release(); __smp_store_release(p, v); } while (0)
0173 #endif
0174
0175 #ifndef smp_load_acquire
0176 #define smp_load_acquire(p) __smp_load_acquire(p)
0177 #endif
0178
0179 #else
0180
0181 #ifndef smp_store_mb
0182 #define smp_store_mb(var, value) do { WRITE_ONCE(var, value); barrier(); } while (0)
0183 #endif
0184
0185 #ifndef smp_mb__before_atomic
0186 #define smp_mb__before_atomic() barrier()
0187 #endif
0188
0189 #ifndef smp_mb__after_atomic
0190 #define smp_mb__after_atomic() barrier()
0191 #endif
0192
0193 #ifndef smp_store_release
0194 #define smp_store_release(p, v) \
0195 do { \
0196 compiletime_assert_atomic_type(*p); \
0197 barrier(); \
0198 WRITE_ONCE(*p, v); \
0199 } while (0)
0200 #endif
0201
0202 #ifndef smp_load_acquire
0203 #define smp_load_acquire(p) \
0204 ({ \
0205 __unqual_scalar_typeof(*p) ___p1 = READ_ONCE(*p); \
0206 compiletime_assert_atomic_type(*p); \
0207 barrier(); \
0208 (typeof(*p))___p1; \
0209 })
0210 #endif
0211
0212 #endif
0213
0214
0215 #define virt_mb() do { kcsan_mb(); __smp_mb(); } while (0)
0216 #define virt_rmb() do { kcsan_rmb(); __smp_rmb(); } while (0)
0217 #define virt_wmb() do { kcsan_wmb(); __smp_wmb(); } while (0)
0218 #define virt_store_mb(var, value) do { kcsan_mb(); __smp_store_mb(var, value); } while (0)
0219 #define virt_mb__before_atomic() do { kcsan_mb(); __smp_mb__before_atomic(); } while (0)
0220 #define virt_mb__after_atomic() do { kcsan_mb(); __smp_mb__after_atomic(); } while (0)
0221 #define virt_store_release(p, v) do { kcsan_release(); __smp_store_release(p, v); } while (0)
0222 #define virt_load_acquire(p) __smp_load_acquire(p)
0223
0224
0225
0226
0227
0228
0229
0230
0231
0232
0233 #ifndef smp_acquire__after_ctrl_dep
0234 #define smp_acquire__after_ctrl_dep() smp_rmb()
0235 #endif
0236
0237
0238
0239
0240
0241
0242
0243
0244
0245
0246
0247 #ifndef smp_cond_load_relaxed
0248 #define smp_cond_load_relaxed(ptr, cond_expr) ({ \
0249 typeof(ptr) __PTR = (ptr); \
0250 __unqual_scalar_typeof(*ptr) VAL; \
0251 for (;;) { \
0252 VAL = READ_ONCE(*__PTR); \
0253 if (cond_expr) \
0254 break; \
0255 cpu_relax(); \
0256 } \
0257 (typeof(*ptr))VAL; \
0258 })
0259 #endif
0260
0261
0262
0263
0264
0265
0266
0267
0268
0269 #ifndef smp_cond_load_acquire
0270 #define smp_cond_load_acquire(ptr, cond_expr) ({ \
0271 __unqual_scalar_typeof(*ptr) _val; \
0272 _val = smp_cond_load_relaxed(ptr, cond_expr); \
0273 smp_acquire__after_ctrl_dep(); \
0274 (typeof(*ptr))_val; \
0275 })
0276 #endif
0277
0278
0279
0280
0281
0282
0283
0284 #ifndef pmem_wmb
0285 #define pmem_wmb() wmb()
0286 #endif
0287
0288
0289
0290
0291
0292
0293
0294
0295 #ifndef io_stop_wc
0296 #define io_stop_wc() do { } while (0)
0297 #endif
0298
0299 #endif
0300 #endif