* [RFC PATCH 0/3] mm/damon: always respect min_nr_regions from the beginning
@ 2026-02-17 0:03 SeongJae Park
2026-02-17 0:03 ` [RFC PATCH 3/3] mm/damon/test/core-kunit: add damon_apply_min_nr_regions() test SeongJae Park
0 siblings, 1 reply; 2+ messages in thread
From: SeongJae Park @ 2026-02-17 0:03 UTC (permalink / raw)
Cc: SeongJae Park, Andrew Morton, Brendan Higgins, David Gow, damon,
kunit-dev, linux-kernel, linux-kselftest, linux-mm
DAMON core assumes min_nr_regions parameter is respected by initial user
setup or the underlying operation set. That is, users are supposed to
set up the initial monitoring regions to have more than min_nr_regions
regions. When the virtual address operation set (vaddr) is used, users
can ask vaddr to do the setup entirely. For the case, vaddr finds
regions for covering the current virtual address mappings, and split
regions to meet the min_nr_regions. DAMON core therefore does nothing
for min_nr_regions at the beginning, and only avoids the number becoming
lower than min_nr_regions, by preventing regions merge operations when
needed.
The user setup requirement is somewhat too much, however, when the
min_nr_regions value is high. Actually there was a report [1] of the
case. Make below three changes for resolving the issue.
First (patch 1), drop the assumption and make DAMON core split regions
at the beginning for respecting the min_nr_regions. Second (patch 2),
drop the vaddr's split operations and related code that are no more
needed. Third (patch 3), add kunit test for the newly introduced
function.
[1] https://lore.kernel.org/CAC5umyjmJE9SBqjbetZZecpY54bHpn2AvCGNv3aF6J=1cfoPXQ@mail.gmail.com
SeongJae Park (3):
mm/damon/core: split regions for min_nr_regions at beginning
mm/damon/vaddr: do not split regions for min_nr_regions
mm/damon/test/core-kunit: add damon_apply_min_nr_regions() test
mm/damon/core.c | 39 ++++++++++++++++--
mm/damon/tests/core-kunit.h | 52 ++++++++++++++++++++++++
mm/damon/tests/vaddr-kunit.h | 76 ------------------------------------
mm/damon/vaddr.c | 70 +--------------------------------
4 files changed, 89 insertions(+), 148 deletions(-)
base-commit: b2e07b9d93a9696f78fb21f2260d5798c6040b28
--
2.47.3
^ permalink raw reply [flat|nested] 2+ messages in thread
* [RFC PATCH 3/3] mm/damon/test/core-kunit: add damon_apply_min_nr_regions() test
2026-02-17 0:03 [RFC PATCH 0/3] mm/damon: always respect min_nr_regions from the beginning SeongJae Park
@ 2026-02-17 0:03 ` SeongJae Park
0 siblings, 0 replies; 2+ messages in thread
From: SeongJae Park @ 2026-02-17 0:03 UTC (permalink / raw)
Cc: SeongJae Park, Andrew Morton, Brendan Higgins, David Gow, damon,
kunit-dev, linux-kernel, linux-kselftest, linux-mm
Add a kunit test for the functionality of damon_apply_min_nr_regions().
Signed-off-by: SeongJae Park <sj@kernel.org>
---
mm/damon/tests/core-kunit.h | 52 +++++++++++++++++++++++++++++++++++++
1 file changed, 52 insertions(+)
diff --git a/mm/damon/tests/core-kunit.h b/mm/damon/tests/core-kunit.h
index 92ea25e2dc9e3..4c19ccac5a2ee 100644
--- a/mm/damon/tests/core-kunit.h
+++ b/mm/damon/tests/core-kunit.h
@@ -1241,6 +1241,57 @@ static void damon_test_set_filters_default_reject(struct kunit *test)
damos_free_filter(target_filter);
}
+static void damon_test_apply_min_nr_regions_for(struct kunit *test,
+ unsigned long sz_regions, unsigned long min_region_sz,
+ unsigned long min_nr_regions,
+ unsigned long max_region_sz_expect,
+ unsigned long nr_regions_expect)
+{
+ struct damon_ctx *ctx;
+ struct damon_target *t;
+ struct damon_region *r;
+ unsigned long max_region_size;
+
+ ctx = damon_new_ctx();
+ if (!ctx)
+ kunit_skip(test, "ctx alloc fail\n");
+ t = damon_new_target();
+ if (!t) {
+ damon_destroy_ctx(ctx);
+ kunit_skip(test, "target alloc fail\n");
+ }
+ damon_add_target(ctx, t);
+ r = damon_new_region(0, sz_regions);
+ if (!r) {
+ damon_destroy_ctx(ctx);
+ kunit_skip(test, "region alloc fail\n");
+ }
+ damon_add_region(r, t);
+
+ ctx->min_region_sz = min_region_sz;
+ ctx->attrs.min_nr_regions = min_nr_regions;
+ max_region_size = damon_apply_min_nr_regions(ctx);
+
+ KUNIT_EXPECT_EQ(test, max_region_size, max_region_sz_expect);
+ KUNIT_EXPECT_EQ(test, damon_nr_regions(t), nr_regions_expect);
+
+ damon_destroy_ctx(ctx);
+}
+
+static void damon_test_apply_min_nr_regions(struct kunit *test)
+{
+ /* common, expected setup */
+ damon_test_apply_min_nr_regions_for(test, 10, 1, 10, 1, 10);
+ /* no zero size limit */
+ damon_test_apply_min_nr_regions_for(test, 10, 1, 15, 1, 10);
+ /* max size should be aligned by min_region_sz */
+ damon_test_apply_min_nr_regions_for(test, 10, 2, 2, 6, 2);
+ /*
+ * when min_nr_regions and min_region_sz conflicts, min_region_sz wins.
+ */
+ damon_test_apply_min_nr_regions_for(test, 10, 2, 10, 2, 5);
+}
+
static struct kunit_case damon_test_cases[] = {
KUNIT_CASE(damon_test_target),
KUNIT_CASE(damon_test_regions),
@@ -1267,6 +1318,7 @@ static struct kunit_case damon_test_cases[] = {
KUNIT_CASE(damos_test_filter_out),
KUNIT_CASE(damon_test_feed_loop_next_input),
KUNIT_CASE(damon_test_set_filters_default_reject),
+ KUNIT_CASE(damon_test_apply_min_nr_regions),
{},
};
--
2.47.3
^ permalink raw reply related [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-02-17 0:04 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-02-17 0:03 [RFC PATCH 0/3] mm/damon: always respect min_nr_regions from the beginning SeongJae Park
2026-02-17 0:03 ` [RFC PATCH 3/3] mm/damon/test/core-kunit: add damon_apply_min_nr_regions() test SeongJae Park
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox