barrier.h 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /*
  3. * Generic barrier definitions.
  4. *
  5. * It should be possible to use these on really simple architectures,
  6. * but it serves more as a starting point for new ports.
  7. *
  8. * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
  9. * Written by David Howells (dhowells@redhat.com)
  10. */
  11. #ifndef __ASM_GENERIC_BARRIER_H
  12. #define __ASM_GENERIC_BARRIER_H
  13. #ifndef __ASSEMBLY__
  14. #include <linux/compiler.h>
  15. #include <linux/kcsan-checks.h>
  16. #include <asm/rwonce.h>
  17. #ifndef nop
  18. #define nop() asm volatile ("nop")
  19. #endif
  20. /*
  21. * Architectures that want generic instrumentation can define __ prefixed
  22. * variants of all barriers.
  23. */
  24. #ifdef __mb
  25. #define mb() do { kcsan_mb(); __mb(); } while (0)
  26. #endif
  27. #ifdef __rmb
  28. #define rmb() do { kcsan_rmb(); __rmb(); } while (0)
  29. #endif
  30. #ifdef __wmb
  31. #define wmb() do { kcsan_wmb(); __wmb(); } while (0)
  32. #endif
  33. #ifdef __dma_mb
  34. #define dma_mb() do { kcsan_mb(); __dma_mb(); } while (0)
  35. #endif
  36. #ifdef __dma_rmb
  37. #define dma_rmb() do { kcsan_rmb(); __dma_rmb(); } while (0)
  38. #endif
  39. #ifdef __dma_wmb
  40. #define dma_wmb() do { kcsan_wmb(); __dma_wmb(); } while (0)
  41. #endif
  42. /*
  43. * Force strict CPU ordering. And yes, this is required on UP too when we're
  44. * talking to devices.
  45. *
  46. * Fall back to compiler barriers if nothing better is provided.
  47. */
  48. #ifndef mb
  49. #define mb() barrier()
  50. #endif
  51. #ifndef rmb
  52. #define rmb() mb()
  53. #endif
  54. #ifndef wmb
  55. #define wmb() mb()
  56. #endif
  57. #ifndef dma_mb
  58. #define dma_mb() mb()
  59. #endif
  60. #ifndef dma_rmb
  61. #define dma_rmb() rmb()
  62. #endif
  63. #ifndef dma_wmb
  64. #define dma_wmb() wmb()
  65. #endif
  66. #ifndef __smp_mb
  67. #define __smp_mb() mb()
  68. #endif
  69. #ifndef __smp_rmb
  70. #define __smp_rmb() rmb()
  71. #endif
  72. #ifndef __smp_wmb
  73. #define __smp_wmb() wmb()
  74. #endif
  75. #ifdef CONFIG_SMP
  76. #ifndef smp_mb
  77. #define smp_mb() do { kcsan_mb(); __smp_mb(); } while (0)
  78. #endif
  79. #ifndef smp_rmb
  80. #define smp_rmb() do { kcsan_rmb(); __smp_rmb(); } while (0)
  81. #endif
  82. #ifndef smp_wmb
  83. #define smp_wmb() do { kcsan_wmb(); __smp_wmb(); } while (0)
  84. #endif
  85. #else /* !CONFIG_SMP */
  86. #ifndef smp_mb
  87. #define smp_mb() barrier()
  88. #endif
  89. #ifndef smp_rmb
  90. #define smp_rmb() barrier()
  91. #endif
  92. #ifndef smp_wmb
  93. #define smp_wmb() barrier()
  94. #endif
  95. #endif /* CONFIG_SMP */
  96. #ifndef __smp_store_mb
  97. #define __smp_store_mb(var, value) do { WRITE_ONCE(var, value); __smp_mb(); } while (0)
  98. #endif
  99. #ifndef __smp_mb__before_atomic
  100. #define __smp_mb__before_atomic() __smp_mb()
  101. #endif
  102. #ifndef __smp_mb__after_atomic
  103. #define __smp_mb__after_atomic() __smp_mb()
  104. #endif
  105. #ifndef __smp_store_release
  106. #define __smp_store_release(p, v) \
  107. do { \
  108. compiletime_assert_atomic_type(*p); \
  109. __smp_mb(); \
  110. WRITE_ONCE(*p, v); \
  111. } while (0)
  112. #endif
  113. #ifndef __smp_load_acquire
  114. #define __smp_load_acquire(p) \
  115. ({ \
  116. __unqual_scalar_typeof(*p) ___p1 = READ_ONCE(*p); \
  117. compiletime_assert_atomic_type(*p); \
  118. __smp_mb(); \
  119. (typeof(*p))___p1; \
  120. })
  121. #endif
  122. #ifdef CONFIG_SMP
  123. #ifndef smp_store_mb
  124. #define smp_store_mb(var, value) do { kcsan_mb(); __smp_store_mb(var, value); } while (0)
  125. #endif
  126. #ifndef smp_mb__before_atomic
  127. #define smp_mb__before_atomic() do { kcsan_mb(); __smp_mb__before_atomic(); } while (0)
  128. #endif
  129. #ifndef smp_mb__after_atomic
  130. #define smp_mb__after_atomic() do { kcsan_mb(); __smp_mb__after_atomic(); } while (0)
  131. #endif
  132. #ifndef smp_store_release
  133. #define smp_store_release(p, v) do { kcsan_release(); __smp_store_release(p, v); } while (0)
  134. #endif
  135. #ifndef smp_load_acquire
  136. #define smp_load_acquire(p) __smp_load_acquire(p)
  137. #endif
  138. #else /* !CONFIG_SMP */
  139. #ifndef smp_store_mb
  140. #define smp_store_mb(var, value) do { WRITE_ONCE(var, value); barrier(); } while (0)
  141. #endif
  142. #ifndef smp_mb__before_atomic
  143. #define smp_mb__before_atomic() barrier()
  144. #endif
  145. #ifndef smp_mb__after_atomic
  146. #define smp_mb__after_atomic() barrier()
  147. #endif
  148. #ifndef smp_store_release
  149. #define smp_store_release(p, v) \
  150. do { \
  151. barrier(); \
  152. WRITE_ONCE(*p, v); \
  153. } while (0)
  154. #endif
  155. #ifndef smp_load_acquire
  156. #define smp_load_acquire(p) \
  157. ({ \
  158. __unqual_scalar_typeof(*p) ___p1 = READ_ONCE(*p); \
  159. barrier(); \
  160. (typeof(*p))___p1; \
  161. })
  162. #endif
  163. #endif /* CONFIG_SMP */
  164. /* Barriers for virtual machine guests when talking to an SMP host */
  165. #define virt_mb() do { kcsan_mb(); __smp_mb(); } while (0)
  166. #define virt_rmb() do { kcsan_rmb(); __smp_rmb(); } while (0)
  167. #define virt_wmb() do { kcsan_wmb(); __smp_wmb(); } while (0)
  168. #define virt_store_mb(var, value) do { kcsan_mb(); __smp_store_mb(var, value); } while (0)
  169. #define virt_mb__before_atomic() do { kcsan_mb(); __smp_mb__before_atomic(); } while (0)
  170. #define virt_mb__after_atomic() do { kcsan_mb(); __smp_mb__after_atomic(); } while (0)
  171. #define virt_store_release(p, v) do { kcsan_release(); __smp_store_release(p, v); } while (0)
  172. #define virt_load_acquire(p) __smp_load_acquire(p)
  173. /**
  174. * smp_acquire__after_ctrl_dep() - Provide ACQUIRE ordering after a control dependency
  175. *
  176. * A control dependency provides a LOAD->STORE order, the additional RMB
  177. * provides LOAD->LOAD order, together they provide LOAD->{LOAD,STORE} order,
  178. * aka. (load)-ACQUIRE.
  179. *
  180. * Architectures that do not do load speculation can have this be barrier().
  181. */
  182. #ifndef smp_acquire__after_ctrl_dep
  183. #define smp_acquire__after_ctrl_dep() smp_rmb()
  184. #endif
  185. /**
  186. * smp_cond_load_relaxed() - (Spin) wait for cond with no ordering guarantees
  187. * @ptr: pointer to the variable to wait on
  188. * @cond: boolean expression to wait for
  189. *
  190. * Equivalent to using READ_ONCE() on the condition variable.
  191. *
  192. * Due to C lacking lambda expressions we load the value of *ptr into a
  193. * pre-named variable @VAL to be used in @cond.
  194. */
  195. #ifndef smp_cond_load_relaxed
  196. #define smp_cond_load_relaxed(ptr, cond_expr) ({ \
  197. typeof(ptr) __PTR = (ptr); \
  198. __unqual_scalar_typeof(*ptr) VAL; \
  199. for (;;) { \
  200. VAL = READ_ONCE(*__PTR); \
  201. if (cond_expr) \
  202. break; \
  203. cpu_relax(); \
  204. } \
  205. (typeof(*ptr))VAL; \
  206. })
  207. #endif
  208. /**
  209. * smp_cond_load_acquire() - (Spin) wait for cond with ACQUIRE ordering
  210. * @ptr: pointer to the variable to wait on
  211. * @cond: boolean expression to wait for
  212. *
  213. * Equivalent to using smp_load_acquire() on the condition variable but employs
  214. * the control dependency of the wait to reduce the barrier on many platforms.
  215. */
  216. #ifndef smp_cond_load_acquire
  217. #define smp_cond_load_acquire(ptr, cond_expr) ({ \
  218. __unqual_scalar_typeof(*ptr) _val; \
  219. _val = smp_cond_load_relaxed(ptr, cond_expr); \
  220. smp_acquire__after_ctrl_dep(); \
  221. (typeof(*ptr))_val; \
  222. })
  223. #endif
  224. /*
  225. * pmem_wmb() ensures that all stores for which the modification
  226. * are written to persistent storage by preceding instructions have
  227. * updated persistent storage before any data access or data transfer
  228. * caused by subsequent instructions is initiated.
  229. */
  230. #ifndef pmem_wmb
  231. #define pmem_wmb() wmb()
  232. #endif
  233. /*
  234. * ioremap_wc() maps I/O memory as memory with write-combining attributes. For
  235. * this kind of memory accesses, the CPU may wait for prior accesses to be
  236. * merged with subsequent ones. In some situation, such wait is bad for the
  237. * performance. io_stop_wc() can be used to prevent the merging of
  238. * write-combining memory accesses before this macro with those after it.
  239. */
  240. #ifndef io_stop_wc
  241. #define io_stop_wc() do { } while (0)
  242. #endif
  243. /*
  244. * Architectures that guarantee an implicit smp_mb() in switch_mm()
  245. * can override smp_mb__after_switch_mm.
  246. */
  247. #ifndef smp_mb__after_switch_mm
  248. # define smp_mb__after_switch_mm() smp_mb()
  249. #endif
  250. #endif /* !__ASSEMBLY__ */
  251. #endif /* __ASM_GENERIC_BARRIER_H */