From: Karl Mehltretter <[email protected]>

Test the PSI current-value helper with explicit totals so the result does
not depend on the test system's memory pressure. Cover an unmeasured
consist goal, unmeasured temporal goals with zero and nonzero effective
quotas, and measured rounds for both tuners. Check last_psi_total after
each call.

Cc: Lian Wang <[email protected]>
Cc: Kunwu Chan <[email protected]>
Assisted-by: LLM
Signed-off-by: Karl Mehltretter <[email protected]>
Reviewed-by: SJ Park <[email protected]>
Signed-off-by: SJ Park <[email protected]>
---
Changes from v2
- v2: https://lore.kernel.org/[email protected]
- Collect R-b: from SJ.
- Split out from the series.
- Rebase to the latest mm-new.
- Delete mention of old behavior, as it is irrelevant for commit message.
Changes from v1
- v1: https://lore.kernel.org/[email protected]/
- Use the previous effective quota for the temporal decision, including
  when it is zero. Keep resetting last_psi_total for new and updated
  goals.
- Move the current-value calculation and last_psi_total update into a
  helper. Test both tuners with explicit samples and check
  last_psi_total after each call.

 mm/damon/tests/core-kunit.h | 43 +++++++++++++++++++++++++++++++++++++
 1 file changed, 43 insertions(+)

diff --git a/mm/damon/tests/core-kunit.h b/mm/damon/tests/core-kunit.h
index df84d9cc7d20..ef4b8b85d67b 100644
--- a/mm/damon/tests/core-kunit.h
+++ b/mm/damon/tests/core-kunit.h
@@ -910,6 +910,48 @@ static void damos_test_commit_quota_goal(struct kunit 
*test)
                        });
 }
 
+static void damos_test_set_psi_current_val(struct kunit *test)
+{
+       struct damos s = {
+               .quota.goal_tuner = DAMOS_QUOTA_GOAL_TUNER_CONSIST,
+       };
+       struct damos_quota_goal goal = {
+               .metric = DAMOS_QUOTA_SOME_MEM_PSI_US,
+               .target_value = 100,
+               .last_psi_total = U64_MAX,
+       };
+
+       /* uninitialized last_psi_total keeps the consist tuner quota */
+       damos_set_psi_current_val(1000, &goal, &s);
+       KUNIT_EXPECT_EQ(test, goal.current_value, 100ul);
+       KUNIT_EXPECT_EQ(test, goal.last_psi_total, 1000ull);
+
+       /* initialized last_psi_total gives the delta */
+       damos_set_psi_current_val(1030, &goal, &s);
+       KUNIT_EXPECT_EQ(test, goal.current_value, 30ul);
+       KUNIT_EXPECT_EQ(test, goal.last_psi_total, 1030ull);
+
+       /* temporal tuner keeps a zero quota */
+       s.quota.goal_tuner = DAMOS_QUOTA_GOAL_TUNER_TEMPORAL;
+       s.quota.esz = 0;
+       goal.last_psi_total = U64_MAX;
+       damos_set_psi_current_val(2000, &goal, &s);
+       KUNIT_EXPECT_EQ(test, goal.current_value, 100ul);
+       KUNIT_EXPECT_EQ(test, goal.last_psi_total, 2000ull);
+
+       /* temporal tuner keeps a non-zero quota */
+       s.quota.esz = SZ_64K;
+       goal.last_psi_total = U64_MAX;
+       damos_set_psi_current_val(3000, &goal, &s);
+       KUNIT_EXPECT_EQ(test, goal.current_value, 0ul);
+       KUNIT_EXPECT_EQ(test, goal.last_psi_total, 3000ull);
+
+       /* temporal tuner uses the measured PSI delta */
+       damos_set_psi_current_val(3250, &goal, &s);
+       KUNIT_EXPECT_EQ(test, goal.current_value, 250ul);
+       KUNIT_EXPECT_EQ(test, goal.last_psi_total, 3250ull);
+}
+
 static void damos_test_commit_quota_goals_for(struct kunit *test,
                struct damos_quota_goal *dst_goals, int nr_dst_goals,
                struct damos_quota_goal *src_goals, int nr_src_goals)
@@ -2260,6 +2302,7 @@ static struct kunit_case damon_test_cases[] = {
        KUNIT_CASE(damon_test_nr_accesses_mvsum),
        KUNIT_CASE(damos_test_new_filter),
        KUNIT_CASE(damos_test_commit_quota_goal),
+       KUNIT_CASE(damos_test_set_psi_current_val),
        KUNIT_CASE(damos_test_commit_quota_goals),
        KUNIT_CASE(damos_test_commit_quota),
        KUNIT_CASE(damos_test_commit_dests),
-- 
2.47.3

Reply via email to