Re: [PATCH 3/4] arm64: barrier: Add smp_cond_load_relaxed_timewait()

Catalin Marinas
2025-03-04T19:29:12Z

On Mon, Feb 03, 2025 at 01:49:10PM -0800, Ankur Arora wrote:
> diff --git a/arch/arm64/include/asm/barrier.h b/arch/arm64/include/asm/barrier.h
> index 1ca947d5c939..25721275a5a2 100644
> --- a/arch/arm64/include/asm/barrier.h
> +++ b/arch/arm64/include/asm/barrier.h
> @@ -216,6 +216,44 @@ do { \
> (typeof(*ptr))VAL; \
> })
>
> +#define __smp_cond_load_relaxed_timewait(ptr, cond_expr, \
> + time_expr_ns, time_limit_ns) \
> +({ \
> + typeof(ptr) __PTR = (ptr); \
> + __unqual_scalar_typeof(*ptr) VAL; \
> + for (;;) { \
> + VAL = READ_ONCE(*__PTR); \
> + if (cond_expr) \
> + break; \
> + __cmpwait_relaxed(__PTR, VAL); \
> + if ((time_expr_ns) >= (time_limit_ns)) \
> + break; \
> + } \
> + (typeof(*ptr))VAL; \
> +})

Rename this to something like *_evstrm as this doesn't really work
unless we have the event stream. Another one would be *_wfet.

> +
> +/*
> + * For the unlikely case that the event-stream is unavailable,
> + * ward off the possibility of waiting forever by falling back
> + * to the generic spin-wait.
> + */
> +#define smp_cond_load_relaxed_timewait(ptr, cond_expr, \
> + time_expr_ns, time_limit_ns) \
> +({ \
> + __unqual_scalar_typeof(*ptr) _val; \
> + int __wfe = arch_timer_evtstrm_available(); \

This should be a bool.

> + \
> + if (likely(__wfe)) \
> + _val = __smp_cond_load_relaxed_timewait(ptr, cond_expr, \
> + time_expr_ns, \
> + time_limit_ns); \
> + else \
> + _val = __smp_cond_load_relaxed_spinwait(ptr, cond_expr, \
> + time_expr_ns, \
> + time_limit_ns); \
> + (typeof(*ptr))_val; \
> +})

Not sure there's much to say here, this depends on the actual interface
introduced by patch 1. If we make some statements about granularity of
some time_cond_expr check, we'll have to take that into account.

--
Catalin