linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 2/2] mm/damon/core: tunning nr_subregions at the kdamond_split_regions()
@ 2026-01-13 12:17 JaeJoon Jung
  0 siblings, 0 replies; only message in thread
From: JaeJoon Jung @ 2026-01-13 12:17 UTC (permalink / raw)
  To: sj; +Cc: JaeJoon Jung, damon, linux-mm, linux-kernel, rgbi3307

Currently, DAMON is designed to allow the number of nr_subregions to be
set from minimum of 10 to maximum of 1000.  kdamond_split_regions() splits
the region by setting nr_subregions to 2 or 3.  This splits the region too
narrowly, resulting in an overly wide address sampling range and increased
access determination failures.

Below are the test results for a case where address access determination
succeeded only in the first half of the address region, while failure
occurred in the latter half, when the address region was set to the
[1G, 4G] range.

When there are few nr_regions: (8)

    |--------|--------|---------|-------|-------|-------|-------|
    0        1        2         3       4       5       6       7

   target, nr_regions, addr region [1G, (sample_addr), 4G] nr  age
 --------------------- ----------------------------------- --- ---
TRACE [ 1] t=0, nr=8, [1073741824,(1073742349),1075138560] 20   0
TRACE [ 2] t=0, nr=8, [1075138560,(1075142341),1233899520]  0   0
TRACE [ 3] t=0, nr=8, [1233899520,(1360224040),1515687936]  0   0
TRACE [ 4] t=0, nr=8, [1515687936,(1872615549),2246262784]  0   0
TRACE [ 5] t=0, nr=8, [2246262784,(2294436960),2536173568]  0   0
TRACE [ 6] t=0, nr=8, [2536173568,(2577497080),2748776448]  0   0
TRACE [ 7] t=0, nr=8, [2748776448,(2818332252),3328598016]  0   0
TRACE [ 8] t=0, nr=8, [3328598016,(3553053181),4294967296]  0   0

When determining nr_subregions in kdamond_split_regions(), the number of
nr_subregions is not fixed at 2 or 3, but can be adjusted based on the
number of nr_regions and the sample_interval.

If the number of nr_regions is small, the number of nr_subregions is
increased, and conversely, if the number of nr_regions is large, the
number of nr_subregions is decreased. (Reducing access failures)

As the sample_interval increases, the number of nr_subregions is
increased.  As the sample_interval decreases, the number of
nr_subregions is also reduced. (Reducing system load)

Below is a test result showing that increasing nr_subregions increases
the access determination success rate when the address range is set to
[1G, 4G].

When there are many nr_regions: (16)

    |----|---|----|---|----|----|---|---|---|---|---|---|---|---|
    0    1   2    3   4    5    6   7   8   9                   15

   target, nr_regions, addr region [1G, (sample_addr), 4G] nr  age
 --------------------- ----------------------------------- --- ---
TRACE [ 1] t=0, nr=16, [1073741824,(1073742496),1074819072] 20   4
TRACE [ 2] t=0, nr=16, [1074819072,(1086087568),1396940800]  0   2
TRACE [ 3] t=0, nr=16, [1396940800,(1408406119),1709060096]  0   0
TRACE [ 4] t=0, nr=16, [1709060096,(1718634828),2029752320]  0   0
TRACE [ 5] t=0, nr=16, [2029752320,(2033076942),2147844096]  0   0
TRACE [ 6] t=0, nr=16, [2147844096,(2147870592),2148532224] 20   5
TRACE [ 7] t=0, nr=16, [2148532224,(2163851851),2466242560]  0   0
TRACE [ 8] t=0, nr=16, [2466242560,(2466983182),2786467840]  0   1
TRACE [ 9] t=0, nr=16, [2786467840,(2794755756),3105136640]  0   0
TRACE [10] t=0, nr=16, [3105136640,(3108065434),3221405696]  0   0
TRACE [11] t=0, nr=16, [3221405696,(3221424712),3222261760] 20   4
TRACE [12] t=0, nr=16, [3222261760,(3222269016),3222290432] 13   0
TRACE [13] t=0, nr=16, [3222290432,(3234589365),3542605824]  0   0
TRACE [14] t=0, nr=16, [3542605824,(3551138058),3859030016]  0   0
TRACE [15] t=0, nr=16, [3859030016,(3866123754),4178018304]  0   1
TRACE [16] t=0, nr=16, [4178018304,(4179564176),4294967296]  0   0

Signed-off-by: JaeJoon Jung <rgbi3307@gmail.com>
---
 mm/damon/core.c | 28 +++++++++++++++++-----------
 1 file changed, 17 insertions(+), 11 deletions(-)

diff --git a/mm/damon/core.c b/mm/damon/core.c
index ff9af9d6a788..4bc44c6545a2 100644
--- a/mm/damon/core.c
+++ b/mm/damon/core.c
@@ -2423,24 +2423,30 @@ static void kdamond_split_regions(struct damon_ctx *ctx)
 {
 	struct damon_target *t;
 	unsigned int nr_regions = 0;
-	static unsigned int last_nr_regions;
-	int nr_subregions = 2;
+	const unsigned int nr_min = ctx->attrs.min_nr_regions;	/*   10 */
+	const unsigned int nr_max = ctx->attrs.max_nr_regions;	/* 1000 */
+	const unsigned long si_min = ctx->attrs.intervals_goal.min_sample_us;
+	unsigned long si = ctx->attrs.sample_interval;
+	int nr_subregions;

 	damon_for_each_target(t, ctx)
 		nr_regions += damon_nr_regions(t);

-	if (nr_regions > ctx->attrs.max_nr_regions / 2)
-		return;
-
-	/* Maybe the middle of the region has different access frequency */
-	if (last_nr_regions == nr_regions &&
-			nr_regions < ctx->attrs.max_nr_regions / 3)
-		nr_subregions = 3;
+	nr_subregions = (nr_regions > nr_min) ?
+			((si > si_min * 100) ? nr_max / 10 : nr_max / 20)
+			: nr_max;
+	/*
+	 * nr_subregions is maximized within the range not exceeding nr_max.
+	 * Increasing nr_subregions minimizes missed address detection.
+	 */
+	while (nr_subregions * nr_regions > nr_max) {
+		nr_subregions -= 4;
+		if (nr_subregions < 2)
+			return;
+	}

 	damon_for_each_target(t, ctx)
 		damon_split_regions_of(t, nr_subregions, ctx->min_sz_region);
-
-	last_nr_regions = nr_regions;
 }

 /*
--
2.43.0



^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2026-01-13 12:17 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-01-13 12:17 [PATCH 2/2] mm/damon/core: tunning nr_subregions at the kdamond_split_regions() JaeJoon Jung

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox