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 --- 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