[RFC PATCH 01/12] mm/damon/core: introduce nr_snapshots damos stat

SeongJae Park
2025-11-23T18:43:44Z

DAMON generates monitoring results snapshots for every sampling
interval. DAMOS applies given schemes on the regions of the snapshots,
for every apply interval of the scheme.

DAMOS stat informs a given scheme has tried to how many memory entities
and applied, in the region and byte level. In some use cases including
user-space oriented tuning and investigations, it is useful to know that
in the DAMON-snapshot level. Introduce a new stat, namely nr_snapshots
for DAMON core API callers.

Signed-off-by: SeongJae Park <sj@kernel.org>
---
include/linux/damon.h | 3 +++
mm/damon/core.c | 13 ++++++++++---
2 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/include/linux/damon.h b/include/linux/damon.h
index 3813373a9200..1d8a1515e75a 100644
--- a/include/linux/damon.h
+++ b/include/linux/damon.h
@@ -330,6 +330,8 @@ struct damos_watermarks {
* @sz_ops_filter_passed:
* Total bytes that passed ops layer-handled DAMOS filters.
* @qt_exceeds: Total number of times the quota of the scheme has exceeded.
+ * @nr_snapshots:
+ * Total number of DAMON snapshots that the scheme has tried.
*
* "Tried an action to a region" in this context means the DAMOS core logic
* determined the region as eligible to apply the action. The access pattern
@@ -355,6 +357,7 @@ struct damos_stat {
unsigned long sz_applied;
unsigned long sz_ops_filter_passed;
unsigned long qt_exceeds;
+ unsigned long nr_snapshots;
};

/**
diff --git a/mm/damon/core.c b/mm/damon/core.c
index f9fc0375890a..af922d5e500c 100644
--- a/mm/damon/core.c
+++ b/mm/damon/core.c
@@ -157,6 +157,12 @@ void damon_destroy_region(struct damon_region *r, struct damon_target *t)
damon_free_region(r);
}

+static bool damon_is_last_region(struct damon_region *r,
+ struct damon_target *t)
+{
+ return list_is_last(&t->regions_list, &r->list);
+}
+
/*
* Check whether a region is intersecting an address range
*
@@ -1949,10 +1955,11 @@ static void damon_do_apply_schemes(struct damon_ctx *c,
if (damos_skip_charged_region(t, &r, s, c->min_sz_region))
continue;

- if (!damos_valid_target(c, t, r, s))
- continue;
+ if (damos_valid_target(c, t, r, s))
+ damos_apply_scheme(c, t, r, s);

- damos_apply_scheme(c, t, r, s);
+ if (damon_is_last_region(r, t))
+ s->stat.nr_snapshots++;
}
}

--
2.47.3