[PATCH v15 16/16] barrier: timeout validity checks for smp_cond_load_acquire_timeout()

From: Ankur Arora

Date: Mon Aug 31 2026 - 17:17:15 EST


Extend timeout tests in smp_cond_expiry_params to also test
smp_cond_load_acquire_timeout().

The interface supports clocks that can return error on timeout.
These are used by rqspinlock. Test that by using a similar clock
that starts returning error past timeout.

Signed-off-by: Ankur Arora <ankur.a.arora@xxxxxxxxxx>
---
lib/tests/barrier-timeout-test.c | 48 +++++++++++++++++++++++++++++++-
1 file changed, 47 insertions(+), 1 deletion(-)

diff --git a/lib/tests/barrier-timeout-test.c b/lib/tests/barrier-timeout-test.c
index 9b16ad6f5514..ba5b6820d0b6 100644
--- a/lib/tests/barrier-timeout-test.c
+++ b/lib/tests/barrier-timeout-test.c
@@ -156,7 +156,7 @@ static void expiry_param_to_desc(const struct smp_cond_expiry_params *p, char *d

snprintf(desc, KUNIT_PARAM_DESC_SIZE,
"smp_cond_*_timeout: clock=%s, timeout=%s, iterations %s",
- "synthetic", p->desc, iters);
+ "synthetic/failing", p->desc, iters);
}

static void test_smp_cond_relaxed(struct kunit *test)
@@ -194,10 +194,56 @@ static void test_smp_cond_relaxed(struct kunit *test)
KUNIT_EXPECT_GE(test, runtime, p->timeout_ns);
}

+/*
+ * Use a clock similar to the one used in rqspinlock where it start
+ * returning failure value once it goes beyond the timeout.
+ */
+static s64 failing_clock(const struct smp_cond_expiry_params *p,
+ struct clock_state *clk)
+{
+ clk->end_time += clk->extra;
+ clk->niters++;
+
+ if ((u64)clk->end_time >= (u64)p->timeout_ns)
+ return -ETIMEDOUT;
+
+ return clk->end_time;
+}
+
+static void test_smp_cond_acquire_error(struct kunit *test)
+{
+ const struct smp_cond_expiry_params *p = test->param_value;
+ struct clock_state clk = {
+ .start_time = 0,
+ .end_time = 0,
+ .extra = p->clk_unit,
+ .niters = 0,
+ };
+ s64 ret = -ETIMEDOUT;
+
+ flag = 0;
+ smp_cond_load_acquire_timeout(&flag,
+ 0,
+ (ret = failing_clock(p, &clk)),
+ p->timeout_ns);
+
+ if (p->miniters != -1)
+ KUNIT_EXPECT_GE(test, clk.niters, p->miniters);
+ if (p->maxiters != -1)
+ KUNIT_EXPECT_LE(test, clk.niters, p->maxiters);
+
+ /*
+ * flag is never updated so the clock should eventually
+ * hit the timeout and error out.
+ */
+ KUNIT_EXPECT_EQ(test, ret, -ETIMEDOUT);
+}
+
KUNIT_ARRAY_PARAM(smp_cond_expiry_params, expiry_params_list, expiry_param_to_desc);
static struct kunit_case barrier_timeout_test_cases[] = {
KUNIT_CASE_PARAM(test_smp_cond_timeout, smp_cond_update_params_gen_params),
KUNIT_CASE_PARAM(test_smp_cond_relaxed, smp_cond_expiry_params_gen_params),
+ KUNIT_CASE_PARAM(test_smp_cond_acquire_error, smp_cond_expiry_params_gen_params),
{}
};

--
2.43.7