diff options
Diffstat (limited to 'include/linux/compiler.h')
-rw-r--r-- | include/linux/compiler.h | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/include/linux/compiler.h b/include/linux/compiler.h index 2bcaedc0f032..59a7004fc7dd 100644 --- a/include/linux/compiler.h +++ b/include/linux/compiler.h | |||
@@ -305,6 +305,17 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s | |||
305 | }) | 305 | }) |
306 | 306 | ||
307 | /** | 307 | /** |
308 | * smp_acquire__after_ctrl_dep() - Provide ACQUIRE ordering after a control dependency | ||
309 | * | ||
310 | * A control dependency provides a LOAD->STORE order, the additional RMB | ||
311 | * provides LOAD->LOAD order, together they provide LOAD->{LOAD,STORE} order, | ||
312 | * aka. (load)-ACQUIRE. | ||
313 | * | ||
314 | * Architectures that do not do load speculation can have this be barrier(). | ||
315 | */ | ||
316 | #define smp_acquire__after_ctrl_dep() smp_rmb() | ||
317 | |||
318 | /** | ||
308 | * smp_cond_load_acquire() - (Spin) wait for cond with ACQUIRE ordering | 319 | * smp_cond_load_acquire() - (Spin) wait for cond with ACQUIRE ordering |
309 | * @ptr: pointer to the variable to wait on | 320 | * @ptr: pointer to the variable to wait on |
310 | * @cond: boolean expression to wait for | 321 | * @cond: boolean expression to wait for |
@@ -314,10 +325,6 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s | |||
314 | * | 325 | * |
315 | * Due to C lacking lambda expressions we load the value of *ptr into a | 326 | * Due to C lacking lambda expressions we load the value of *ptr into a |
316 | * pre-named variable @VAL to be used in @cond. | 327 | * pre-named variable @VAL to be used in @cond. |
317 | * | ||
318 | * The control dependency provides a LOAD->STORE order, the additional RMB | ||
319 | * provides LOAD->LOAD order, together they provide LOAD->{LOAD,STORE} order, | ||
320 | * aka. ACQUIRE. | ||
321 | */ | 328 | */ |
322 | #ifndef smp_cond_load_acquire | 329 | #ifndef smp_cond_load_acquire |
323 | #define smp_cond_load_acquire(ptr, cond_expr) ({ \ | 330 | #define smp_cond_load_acquire(ptr, cond_expr) ({ \ |
@@ -329,7 +336,7 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s | |||
329 | break; \ | 336 | break; \ |
330 | cpu_relax(); \ | 337 | cpu_relax(); \ |
331 | } \ | 338 | } \ |
332 | smp_rmb(); /* ctrl + rmb := acquire */ \ | 339 | smp_acquire__after_ctrl_dep(); \ |
333 | VAL; \ | 340 | VAL; \ |
334 | }) | 341 | }) |
335 | #endif | 342 | #endif |