[PATCH v2 1/2] mm/damon/core: charge only the part of a region the filter left
From: SJ Park
Date: Mon Sep 21 2026 - 12:40:55 EST
From: Donggeun Yoo <donggeunyoo.kernel@xxxxxxxxx>
An address range DAMOS filter that partially overlaps a monitoring
region splits the region at the filter boundary, so the scheme action is
applied to only one side of it. damos_apply_scheme() reads the region
size once on entry, before damos_core_filter_out() performs that split.
The quota charge and the statistics update therefore account for the
region as it was before the trim. schemes/<S>/stats/sz_tried counts
memory the filter excluded, which Documentation/mm/damon/design.rst says
is not counted as tried, and with quotas/bytes set the excluded part is
charged against the budget, throttling the scheme to a fraction of what
was configured.
User impact is that DAMOS could unexpectedly slowly run, due to
over-charged quota. DAMOS stat could also be confusing. No critical
events such as crashes or leask happen.
Re-read the region size after the core filters have run.
Fixes: ab9bda001b68 ("mm/damon/core: introduce address range type damos filter")
Cc: <stable@xxxxxxxxxxxxxxx> # 6.6.x
Signed-off-by: Donggeun Yoo <donggeunyoo.kernel@xxxxxxxxx>
Reviewee-by: SJ Park <sj@xxxxxxxxxx>
Signed-off-by: SJ Park <sj@xxxxxxxxxx>
---
mm/damon/core.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/mm/damon/core.c b/mm/damon/core.c
index 0aa5d0ea8ebc..4687b909d42c 100644
--- a/mm/damon/core.c
+++ b/mm/damon/core.c
@@ -2784,6 +2784,7 @@ static void damos_apply_scheme(struct damon_ctx *c, struct damon_target *t,
}
if (damos_core_filter_out(c, t, r, s))
return;
+ sz = damon_sz_region(r);
ktime_get_coarse_ts64(&begin);
trace_damos_before_apply(cidx, sidx, tidx, r, nr_accesses,
damon_nr_regions(t), do_trace);
--
2.47.3