From 20a0f2b4705c3f2e476270c54e79637893b5e50b Mon Sep 17 00:00:00 2001 From: Liew Rui Yan Date: Mon, 5 Oct 2026 23:52:07 -0700 Subject: [PATCH] mm/damon/tests/core-kunit: add test for unconditionally skipping the last region Commit b3723b596b54 ("mm/damon/core: fix unconditionally skip last region") fixed a minor bug. Add a KUnit test case to cover this behavior and prevent regressions in the future. Link: https://lore.kernel.org/20261006065209.41507-4-sj@kernel.org Signed-off-by: Liew Rui Yan Signed-off-by: SJ Park Signed-off-by: Andrew Morton Reviewed-by: SJ Park Cc: Brendan Higgins Cc: David Gow --- mm/damon/tests/core-kunit.h | 42 +++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/mm/damon/tests/core-kunit.h b/mm/damon/tests/core-kunit.h index ef146ca2ae8a..3fbb4e4e36fa 100644 --- a/mm/damon/tests/core-kunit.h +++ b/mm/damon/tests/core-kunit.h @@ -2439,6 +2439,47 @@ static void damos_test_esz_goal_temporal(struct kunit *test) damon_destroy_ctx(ctx); } +static void damon_test_last_region_quota_reset(struct kunit *test) +{ + struct damos s = {0}; + struct damon_target *t; + struct damon_region *r1, *r2; + unsigned long min_region_sz = 1; + bool skipped; + + t = damon_new_target(); + if (!t) + kunit_skip(test, "target alloc fail"); + + r1 = damon_new_region(0, 100); + if (!r1) { + damon_free_target(t); + kunit_skip(test, "region 1 alloc fail"); + } + damon_add_region(r1, t); + + r2 = damon_new_region(100, 200); + if (!r2) { + damon_free_target(t); + kunit_skip(test, "region 2 alloc fail"); + } + damon_add_region(r2, t); + + s.quota.charge_target_from = t; + s.quota.charge_addr_from = r1->ar.end; + + skipped = damos_skip_charged_region(t, r2, &s, min_region_sz); + + /* 'r2' is not processed, it should not skip */ + KUNIT_EXPECT_EQ(test, skipped, false); + + /* 'r2' is last region, it should reset charge_{target,addr}_from */ + KUNIT_EXPECT_PTR_EQ(test, s.quota.charge_target_from, NULL); + KUNIT_EXPECT_EQ(test, s.quota.charge_addr_from, 0); + + damon_free_target(t); +} + static struct kunit_case damon_test_cases[] = { KUNIT_CASE(damon_test_target), KUNIT_CASE(damon_test_regions), @@ -2482,6 +2523,7 @@ static struct kunit_case damon_test_cases[] = { KUNIT_CASE(damon_test_walk_control_obsolete), KUNIT_CASE(damon_test_rand), KUNIT_CASE(damos_test_esz_goal_temporal), + KUNIT_CASE(damon_test_last_region_quota_reset), {}, };