diff options
author | Peter Zijlstra <peterz@infradead.org> | 2015-10-16 08:39:38 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2015-12-04 04:33:41 -0500 |
commit | b3e0b1b6d841a4b2f64fc09ea728913da8218424 (patch) | |
tree | 93df412814210f3e4d36dae4e39487aec17a431e /include/linux/compiler.h | |
parent | 829cf31751aa1c50b1527c1e0c821c99246b5639 (diff) |
locking, sched: Introduce smp_cond_acquire() and use it
Introduce smp_cond_acquire() which combines a control dependency and a
read barrier to form acquire semantics.
This primitive has two benefits:
- it documents control dependencies,
- its typically cheaper than using smp_load_acquire() in a loop.
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'include/linux/compiler.h')
-rw-r--r-- | include/linux/compiler.h | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/include/linux/compiler.h b/include/linux/compiler.h index 4dac1036594f..00b042c49ccd 100644 --- a/include/linux/compiler.h +++ b/include/linux/compiler.h | |||
@@ -299,6 +299,23 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s | |||
299 | __u.__val; \ | 299 | __u.__val; \ |
300 | }) | 300 | }) |
301 | 301 | ||
302 | /** | ||
303 | * smp_cond_acquire() - Spin wait for cond with ACQUIRE ordering | ||
304 | * @cond: boolean expression to wait for | ||
305 | * | ||
306 | * Equivalent to using smp_load_acquire() on the condition variable but employs | ||
307 | * the control dependency of the wait to reduce the barrier on many platforms. | ||
308 | * | ||
309 | * The control dependency provides a LOAD->STORE order, the additional RMB | ||
310 | * provides LOAD->LOAD order, together they provide LOAD->{LOAD,STORE} order, | ||
311 | * aka. ACQUIRE. | ||
312 | */ | ||
313 | #define smp_cond_acquire(cond) do { \ | ||
314 | while (!(cond)) \ | ||
315 | cpu_relax(); \ | ||
316 | smp_rmb(); /* ctrl + rmb := acquire */ \ | ||
317 | } while (0) | ||
318 | |||
302 | #endif /* __KERNEL__ */ | 319 | #endif /* __KERNEL__ */ |
303 | 320 | ||
304 | #endif /* __ASSEMBLY__ */ | 321 | #endif /* __ASSEMBLY__ */ |