From: Donggeun Yoo <[email protected]>

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 <[email protected]>
Reviewed-by: SJ Park <[email protected]>
Signed-off-by: SJ Park <[email protected]>
---
 mm/damon/tests/core-kunit.h | 48 +++++++++++++++++++++++++++++++++++++
 1 file changed, 48 insertions(+)

diff --git a/mm/damon/tests/core-kunit.h b/mm/damon/tests/core-kunit.h
index ef4b8b85d67b..caf582882f5f 100644
--- a/mm/damon/tests/core-kunit.h
+++ b/mm/damon/tests/core-kunit.h
@@ -2284,6 +2284,53 @@ static void damon_test_rand(struct kunit *test)
        }
 }
 
+static void damos_test_esz_goal_temporal(struct kunit *test)
+{
+       struct damos_access_pattern pattern = {};
+       struct damos_watermarks wmarks = {};
+       struct damos_quota quota = {
+               .goal_tuner = DAMOS_QUOTA_GOAL_TUNER_TEMPORAL,
+       };
+       struct damos_quota_goal *goal;
+       struct damon_ctx *ctx;
+       struct damos *s;
+
+       ctx = damon_new_ctx();
+       KUNIT_ASSERT_NOT_NULL(test, ctx);
+
+       s = damon_new_scheme(&pattern, DAMOS_STAT, 0, &quota, &wmarks,
+                       NUMA_NO_NODE);
+       if (!s) {
+               damon_destroy_ctx(ctx);
+               kunit_skip(test, "scheme alloc fail");
+       }
+       damon_add_scheme(ctx, s);
+
+       goal = damos_new_quota_goal(DAMOS_QUOTA_USER_INPUT, 10000);
+       if (!goal) {
+               damon_destroy_ctx(ctx);
+               kunit_skip(test, "quota goal alloc fail");
+       }
+       goal->current_value = 0;
+       damos_add_quota_goal(&s->quota, goal);
+
+       /* The largest size quota the basis-point conversion can hold. */
+       s->quota.sz = ULONG_MAX / 10000;
+       damos_set_effective_quota(ctx, s);
+       KUNIT_EXPECT_EQ(test, s->quota.esz, ULONG_MAX / 10000);
+
+       /* Any larger one saturates instead of wrapping. */
+       s->quota.sz = ULONG_MAX / 10000 + 1;
+       damos_set_effective_quota(ctx, s);
+       KUNIT_EXPECT_EQ(test, s->quota.esz, ULONG_MAX / 10000);
+
+       s->quota.sz = ULONG_MAX;
+       damos_set_effective_quota(ctx, s);
+       KUNIT_EXPECT_EQ(test, s->quota.esz, ULONG_MAX / 10000);
+
+       damon_destroy_ctx(ctx);
+}
+
 static struct kunit_case damon_test_cases[] = {
        KUNIT_CASE(damon_test_target),
        KUNIT_CASE(damon_test_regions),
@@ -2324,6 +2371,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.47.3

Reply via email to