Add smp_cond_load_acquire_timewait(), a timed variant of smp_cond_load_acquire(). This is useful for cases where we want to wait on a conditional variable but want to ensure termination. smp_cond_load_acquire_timewait() is implemented via the relaxed variant, with the additional LOAD->LOAD ordering via smp_acquire__after_ctrl_dep(). Cc: Arnd Bergmann <arnd@xxxxxxxx> Cc: Will Deacon <will@xxxxxxxxxx> Cc: Catalin Marinas <catalin.marinas@xxxxxxx> Cc: Peter Zijlstra <peterz@xxxxxxxxxxxxx> Cc: Kumar Kartikeya Dwivedi <memxor@xxxxxxxxx> Cc: linux-arch@xxxxxxxxxxxxxxx Signed-off-by: Ankur Arora <ankur.a.arora@xxxxxxxxxx> --- include/asm-generic/barrier.h | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/include/asm-generic/barrier.h b/include/asm-generic/barrier.h index 31de8ed2a05e..62673ad37db2 100644 --- a/include/asm-generic/barrier.h +++ b/include/asm-generic/barrier.h @@ -321,6 +321,29 @@ do { \ #define smp_cond_load_relaxed_timewait __smp_cond_load_relaxed_spinwait #endif +/** + * smp_cond_load_acquire_timewait() - (Spin) wait for cond with ACQUIRE ordering + * until a timeout expires. + * @ptr: pointer to the variable to wait on + * @cond: boolean expression to wait for + * @time_expr_ns: evaluates to the current time + * @time_limit_ns: compared against time_expr_ns + * + * Equivalent to using smp_cond_load_acquire() on the condition variable with + * a timeout. + */ +#ifndef smp_cond_load_acquire_timewait +#define smp_cond_load_acquire_timewait(ptr, cond_expr, time_expr_ns, \ + time_limit_ns) ({ \ + __unqual_scalar_typeof(*ptr) _val; \ + _val = smp_cond_load_relaxed_timewait(ptr, cond_expr, \ + time_expr_ns, \ + time_limit_ns); \ + smp_acquire__after_ctrl_dep(); \ + (typeof(*ptr))_val; \ +}) +#endif + /* * pmem_wmb() ensures that all stores for which the modification * are written to persistent storage by preceding instructions have -- 2.43.5