From: Liew Rui Yan <[email protected]> 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. Signed-off-by: Liew Rui Yan <[email protected]> Reviewed-by: SJ Park <[email protected]> Signed-off-by: SJ Park <[email protected]> --- Changes from v3 - v3: https://lore.kernel.org/[email protected] - Collect R-b: from SJ. - Rebase to the latest mm-new. Changes from v2: - v2: https://lore.kernel.org/damon/[email protected] - Change the commit message, mention the fix rather than the original bug. Changes from v1 RESEND: - v1 RESEND: https://lore.kernel.org/damon/[email protected] - Drop braces for single line, as suggested [1] in coding-style. - Set min_region_sz initial value to power-of-2 value, '1'. Changes from v1: - v1: https://lore.kernel.org/damon/[email protected] - Resend since the dependent patch is merged into mm-new, that would help us getting AI review help. 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), {}, }; -- 2.47.3

