[PATCH v1 2/2] mm/damon/tests/core-kunit: test the temporal tuner's size quota conversion

From: Donggeun Yoo

Date: Sat Sep 19 2026 - 03:13:49 EST


damos_goal_tune_esz_bp_temporal() encodes the size quota in basis points,
so the conversion is exact only up to ULONG_MAX / 10000. Pin the three
sizes around that boundary: the largest one that fits, the first one that
does not, and ULONG_MAX.

Signed-off-by: Donggeun Yoo <donggeunyoo.kernel@xxxxxxxxx>
---
mm/damon/tests/core-kunit.h | 35 +++++++++++++++++++++++++++++++++++
1 file changed, 35 insertions(+)

diff --git a/mm/damon/tests/core-kunit.h b/mm/damon/tests/core-kunit.h
index 5ff0436c5844..4460dce0352c 100644
--- a/mm/damon/tests/core-kunit.h
+++ b/mm/damon/tests/core-kunit.h
@@ -1929,6 +1929,40 @@ static void damon_test_rand(struct kunit *test)
}
}

+static void damos_test_esz_goal_temporal(struct kunit *test)
+{
+ unsigned long max_sz = ULONG_MAX / 10000;
+ struct damos_quota_goal goal = {
+ .metric = DAMOS_QUOTA_USER_INPUT,
+ .target_value = 10000,
+ .current_value = 0,
+ };
+ struct damon_ctx *ctx;
+ struct damos s;
+
+ ctx = damon_new_ctx();
+ KUNIT_ASSERT_NOT_NULL(test, ctx);
+
+ memset(&s, 0, sizeof(s));
+ INIT_LIST_HEAD(&s.quota.goals);
+ list_add(&goal.list, &s.quota.goals);
+ s.quota.goal_tuner = DAMOS_QUOTA_GOAL_TUNER_TEMPORAL;
+
+ s.quota.sz = max_sz;
+ damos_set_effective_quota(ctx, &s);
+ KUNIT_EXPECT_EQ(test, s.quota.esz, max_sz);
+
+ s.quota.sz = max_sz + 1;
+ damos_set_effective_quota(ctx, &s);
+ KUNIT_EXPECT_EQ(test, s.quota.esz, max_sz);
+
+ s.quota.sz = ULONG_MAX;
+ damos_set_effective_quota(ctx, &s);
+ KUNIT_EXPECT_EQ(test, s.quota.esz, max_sz);
+
+ damon_destroy_ctx(ctx);
+}
+
static struct kunit_case damon_test_cases[] = {
KUNIT_CASE(damon_test_target),
KUNIT_CASE(damon_test_regions),
@@ -1965,6 +1999,7 @@ static struct kunit_case damon_test_cases[] = {
KUNIT_CASE(damon_test_is_last_region),
KUNIT_CASE(damon_test_walk_control_obsolete),
KUNIT_CASE(damon_test_rand),
+ KUNIT_CASE(damos_test_esz_goal_temporal),
{},
};

--
2.53.0