Re: [PATCH 1/5] asm-generic: add smp_vcond_load_relaxed()
From: Okanovic, Haris <hidden>
Date: 2024-11-06 17:18:29
Also in:
kvm, linux-pm, lkml
On Wed, 2024-11-06 at 11:39 +0000, Will Deacon wrote:
CAUTION: This email originated from outside of the organization. Do not click links or open attachments unless you can confirm the sender and know the content is safe. On Tue, Nov 05, 2024 at 12:30:37PM -0600, Haris Okanovic wrote:quoted
Relaxed poll until desired mask/value is observed at the specified address or timeout. This macro is a specialization of the generic smp_cond_load_relaxed(), which takes a simple mask/value condition (vcond) instead of an arbitrary expression. It allows architectures to better specialize the implementation, e.g. to enable wfe() polling of the address on arm.This doesn't make sense to me. The existing smp_cond_load() functions already use wfe on arm64 and I don't see why we need a special helper just to do a mask.
We can't turn an arbitrary C expression into a wfe()/wfet() exit condition, which is one of the inputs to the existing smp_cond_load(). This API is therefore more amenable to hardware acceleration.
quoted
Signed-off-by: Haris Okanovic <redacted> --- include/asm-generic/barrier.h | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+)diff --git a/include/asm-generic/barrier.h b/include/asm-generic/barrier.h index d4f581c1e21d..112027eabbfc 100644 --- a/include/asm-generic/barrier.h +++ b/include/asm-generic/barrier.h@@ -256,6 +256,31 @@ do { \ }) #endif +/** + * smp_vcond_load_relaxed() - (Spin) wait until an expected value at address + * with no ordering guarantees. Spins until `(*addr & mask) == val` or + * `nsecs` elapse, and returns the last observed `*addr` value. + * + * @nsecs: timeout in nanoseconds + * @addr: pointer to an integer + * @mask: a bit mask applied to read values + * @val: Expected value with mask + */ +#ifndef smp_vcond_load_relaxedI know naming is hard, but "vcond" is especially terrible. Perhaps smp_cond_load_timeout()?
I agree, naming is hard! I was trying to differentiate it from smp_cond_load() in some meaningful way - that one is an "expression" condition this one is a "value" condition. I'll think it over a bit more.
Will