On Tue, 3 Mar 2026 20:41:09 -0800 SeongJae Park <[email protected]> wrote:
> Aim-oriented DAMOS quota auto-tuning uses a single tuning algorithm. > The algorithm is designed to find a quota value that should be > consistently kept for achieving the aimed goal for long term. It is > useful and reliable at automatically operating systems that have dynamic > environments in the long term. > > As always, however, no single algorithm fits all. When the environment > has static characteristics or there are control towers in not only the > kernel space but also the user space, the algorithm shows some > limitations. In such environments, users want kernel work in a more > short term deterministic way. Actually there were at least two reports > [1,2] of such cases. > > Extend DAMOS quotas goal to support multiple quota tuning algorithms > that users can select. Keep the current algorithm as the default one, > to not break the old users. Also give it a name, "consist", as it is > designed to "consistently" apply the DAMOS action. And introduce a new > tuning algorithm, namely "temporal". It is designed to apply the DAMOS > action only temporally, in a deterministic way. In more detail, as long > as the goal is under-achieved, it uses the maximum quota available. > Once the goal is over-achieved, it sets the quota zero. > > Tests > ===== > > I confirmed the feature is working as expected using the latest version > of DAMON user-space tool, like below. > > $ # start DAMOS for reclaiming memory aiming 30% free memory > $ sudo ./damo/damo start --damos_action pageout \ > --damos_quota_goal_tuner temporal \ > --damos_quota_goal node_mem_free_bp 30% 0 \ > --damos_quota_interval 1s \ > --damos_quota_space 100M > > Note that >=3.1.8 version of DAMON user-space tool supports this feature > (--damos_quota_goal_tuner). As expected, DAMOS stops reclaiming memory > as soon as the goal amount of free memory is made. When 'consist' tuner > is used, the reclamation was continued even after the goal amount of > free memory is made, resulting in more than goal amount of free memory, > as expected. > > Patch Sequence > ============== > > First four patches implement the features. Patch 1 extends core API to > allow multiple tuners and make the current tuner as the default and only > available tuner, namely 'consist'. Patch 2 allows future tuners setting > zero effective quota. Patch 3 introduces the second tuner, namely > 'temporal'. Patch 4 further extends DAMON sysfs API to let users use > that. > > Three following patches (patches 5-7) update design, usage, and ABI > documents, respectively. > > Final three patches (patches 8-10) are for adding selftests. The eighth > and the ninth patches extend the testing-purpose DAMON sysfs control > helper and DAMON status dumping tool to support the newly added feature. > The tenth patch extends the existing online commit test to cover the new > feature. > > References > ========== > > [1] > https://lore.kernel.org/CALa+Y17__d=zsm1yx+mxx0ozvdsxnfqf4p0g+kateitrwyz...@mail.gmail.com > [2] https://lore.kernel.org/[email protected] > > Changelog > ========= > > Changes from RFC v1 > (https://lore.kernel.org/[email protected]) > - Add selftest for goal_tuner commitment. > - Set goal tuner inside damon_new_scheme(). > - Allow zero size effective size quota. > - Update the ABI document. > - Wordsmith change descriptions. > > SeongJae Park (10): > mm/damon/core: introduce damos_quota_goal_tuner > mm/damon/core: allow quota goals set zero effective size quota > mm/damon/core: introduce DAMOS_QUOTA_GOAL_TUNER_TEMPORAL > mm/damon/sysfs-schemes: implement quotas->goal_tuner file > Docs/mm/damon/design: document the goal-based quota tuner selections > Docs/admin-guide/mm/damon/usage: document goal_tuner sysfs file > Docs/ABI/damon: update for goal_tuner > selftests/damon/_damon_sysfs: support goal_tuner setup > selftests/damon/drgn_dump_damon_status: support quota goal_tuner > dumping > selftests/damon/sysfs.py: test goal_tuner commit Maybe it is better to add a kunit test for the goal_tuner online commit, like below. I will add it to the next spin of this series. Thanks, SJ [...] === >8 === >From 15d87f41d0d960e3c337899629cf4e05d09dc042 Mon Sep 17 00:00:00 2001 From: SeongJae Park <[email protected]> Date: Fri, 6 Mar 2026 16:27:45 -0800 Subject: [PATCH] mm/damon/tests/core-kunit: test goal_tuner commit Signed-off-by: SeongJae Park <[email protected]> --- mm/damon/tests/core-kunit.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mm/damon/tests/core-kunit.h b/mm/damon/tests/core-kunit.h index d759314df00d8..28e5de749db04 100644 --- a/mm/damon/tests/core-kunit.h +++ b/mm/damon/tests/core-kunit.h @@ -791,6 +791,7 @@ static void damos_test_commit_quota(struct kunit *test) .reset_interval = 1, .ms = 2, .sz = 3, + .goal_tuner = DAMOS_QUOTA_GOAL_TUNER_CONSIST, .weight_sz = 4, .weight_nr_accesses = 5, .weight_age = 6, @@ -799,6 +800,7 @@ static void damos_test_commit_quota(struct kunit *test) .reset_interval = 7, .ms = 8, .sz = 9, + .goal_tuner = DAMOS_QUOTA_GOAL_TUNER_TEMPORAL, .weight_sz = 10, .weight_nr_accesses = 11, .weight_age = 12, @@ -812,6 +814,7 @@ static void damos_test_commit_quota(struct kunit *test) KUNIT_EXPECT_EQ(test, dst.reset_interval, src.reset_interval); KUNIT_EXPECT_EQ(test, dst.ms, src.ms); KUNIT_EXPECT_EQ(test, dst.sz, src.sz); + KUNIT_EXPECT_EQ(test, dst.goal_tuner, src.goal_tuner); KUNIT_EXPECT_EQ(test, dst.weight_sz, src.weight_sz); KUNIT_EXPECT_EQ(test, dst.weight_nr_accesses, src.weight_nr_accesses); KUNIT_EXPECT_EQ(test, dst.weight_age, src.weight_age); -- 2.47.3

