[RFC PATCH 08/19] mm/damon/paddr: support data attributes monitoring

SeongJae Park
2026-04-26T20:52:37Z

Implement and register damon_operations->apply_probes() callback to
support data attributes monitoring.

Signed-off-by: SeongJae Park <sj@kernel.org>
---
mm/damon/paddr.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 45 insertions(+)

diff --git a/mm/damon/paddr.c b/mm/damon/paddr.c
index 5cdcc5037cbc1..cacfbf774ca4f 100644
--- a/mm/damon/paddr.c
+++ b/mm/damon/paddr.c
@@ -120,6 +120,50 @@ static unsigned int damon_pa_check_accesses(struct damon_ctx *ctx)
return max_nr_accesses;
}

+static bool damon_pa_filter_pass(phys_addr_t pa, struct damon_probe *p)
+{
+ struct damon_filter *f;
+ bool default_pass = true;
+
+ damon_for_each_filter(f, p) {
+ bool matched = false;
+
+ if (f->type == DAMON_TEST_TYPE_ANON) {
+ struct folio *folio = damon_get_folio(PHYS_PFN(pa));
+
+ if (folio)
+ matched = folio_test_anon(folio);
+ }
+ if (matched)
+ return f->allow;
+ default_pass = !f->allow;
+ }
+ return default_pass;
+}
+
+static void damon_pa_apply_probes(struct damon_ctx *ctx)
+{
+ struct damon_target *t;
+ struct damon_region *r;
+ struct damon_probe *p;
+
+ damon_for_each_target(t, ctx) {
+ damon_for_each_region(r, t) {
+ int i = 0;
+
+ damon_for_each_probe(p, ctx) {
+ phys_addr_t pa;
+
+ pa = damon_pa_phys_addr(r->sampling_addr,
+ ctx->addr_unit);
+ if (damon_pa_filter_pass(pa, p))
+ r->probe_hits[i]++;
+ i++;
+ }
+ }
+ }
+}
+
/*
* damos_pa_filter_out - Return true if the page should be filtered out.
*/
@@ -371,6 +415,7 @@ static int __init damon_pa_initcall(void)
.update = NULL,
.prepare_access_checks = damon_pa_prepare_access_checks,
.check_accesses = damon_pa_check_accesses,
+ .apply_probes = damon_pa_apply_probes,
.target_valid = NULL,
.apply_scheme = damon_pa_apply_scheme,
.get_scheme_score = damon_pa_scheme_score,
--
2.47.3