[PATCH 0/3] mm/damon/core: cleanup code, reduce stack usage, and add kunit

0 views
Skip to first unread message

SJ Park

unread,
Sep 28, 2026, 4:40:07 AM (5 days ago) Sep 28
to Andrew Morton, SJ Park, Arnd Bergmann, Bill Wendling, Brendan Higgins, David Gow, Justin Stitt, Kunwu Chan, Lian Wang, Nathan Chancellor, Nick Desaulniers, Ravi Jonnalagadda, da...@lists.linux.dev, kuni...@googlegroups.com, linux-...@vger.kernel.org, linux-k...@vger.kernel.org, linu...@kvack.org, ll...@lists.linux.dev
Three various improvements. Patch 1 from Zenghui Yu (Huawei) cleans up
unused enums. Patch 2 from Arnd Bergmann reduces kdamond's stack usage.
Patch 3 from Karl Mehltretter adds a kunit test for uninitialized PSI
quota goal stage logic.

Arnd Bergmann (1):
mm/damon/core: reduce stack usage further

Karl Mehltretter (1):
mm/damon/tests/core-kunit: test PSI goal values with explicit samples

Zenghui Yu (Huawei) (1):
mm/damon/api: remove unused NR_DAMOS_* enumerators

include/linux/damon.h | 8 -------
mm/damon/core.c | 9 ++++----
mm/damon/tests/core-kunit.h | 43 +++++++++++++++++++++++++++++++++++++
3 files changed, 48 insertions(+), 12 deletions(-)


base-commit: 9a7b617f9c0b3cc653987c9e6d0434cf1079130f
--
2.47.3

SJ Park

unread,
Sep 28, 2026, 4:40:16 AM (5 days ago) Sep 28
to Andrew Morton, Karl Mehltretter, Brendan Higgins, David Gow, Kunwu Chan, Lian Wang, SJ Park, da...@lists.linux.dev, kuni...@googlegroups.com, linux-...@vger.kernel.org, linux-k...@vger.kernel.org, linu...@kvack.org
From: Karl Mehltretter <kmehlt...@gmail.com>

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 <lian...@gmail.com>
Cc: Kunwu Chan <kunwu...@gmail.com>
Assisted-by: LLM
Signed-off-by: Karl Mehltretter <kmehlt...@gmail.com>
Reviewed-by: SJ Park <s...@kernel.org>
Signed-off-by: SJ Park <s...@kernel.org>
---
Changes from v2
- v2: https://lore.kernel.org/20260921020013.33...@gmail.com
- 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/20260915060937.34...@gmail.com/
- 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 all
Reply to author
Forward
0 new messages