Re: [PATCH 1/4] asm-generic: barrier: Add smp_cond_load_relaxed_timewait()
From: Ankur Arora
Date: Sat Mar 08 2025 - 22:27:21 EST
Catalin Marinas <catalin.marinas@xxxxxxx> writes:
> On Mon, Feb 03, 2025 at 01:49:08PM -0800, Ankur Arora wrote:
>> Add smp_cond_load_relaxed_timewait(), a timed variant of
>> smp_cond_load_relaxed(). This is useful for cases where we want to
>> wait on a conditional variable but don't want to wait indefinitely.
[ ... ]
> What I don't particularly like about this interface is (1) no idea of
> what time granularity it offers, how much it can slip past the deadline,
> even though there's some nanoseconds implied and (2) time_expr_ns leaves
> the caller to figure out why time function to use for tracking the time.
> Well, I can be ok with (2) if we make it a bit more generic.
So I thought about it some more, and on (1), I still feel that a too
specific value of granularity might not be ideal:
Consider that in cpuidle_poll_time() gives 110us, and we derive a
minimum granularity argument of 100us from that.
On arm64, with an event stream period of 100us, that might mean that we
spend part of the time taking the WFE path, and the remaining in the
cpu_relax() portion.
Now, depending on how this call aligns with the event-stream, this
this might mean we spend anywhere from say 100us to 10us in WFE and
10us to 100us in the cpu_relax() loop.
At least for the poll_idle() power consumption, this seems bad.
If, however, the granularity did not depend on an actual time value,
but just a representation of what the caller can tolerate (as I argue
in the other mail), then poll_idle() could just specify granularity=coarse
and we would always take the WFE path.
But, maybe you were thinking of other cases where a integer value
of granularity might be useful?
[...]
> We could add a slack range argument like the
> delta_ns for some of the hrtimer API and let the arch code decide
> whether to honour it.
If there are cases like that, then a slack range could serve both
purposes with slack tolerant cases like idle/resilient spilocks
specifying a large value and more constrained users specifying a
lower value.
However, I don't see how arch code can choose not to honour this.
Thanks
--
ankur