[PATCH 1/2] mm/damon: fix nr_snapshots counting using tried_applied flag
Liew Rui Yan <[email protected]>
| Newsgroups | dev.linux.lists.damon,org.kvack.linux-mm |
|---|---|
| Message-ID | <[email protected]> |
Currently, nr_snapshots is only incremented when damon_is_last_region() returns true. This is semantically incorrect because nr_snapshots should count the number of DAMON snapshots (aggregation intervals) where the scheme was tried to be applied, as documented in design.rst. The "tried to be applied" means the scheme passed all guard checks including access pattern, quotas, watermarks, and max_nr_snapshots filters. The old damon_is_last_region() check does not accurately reflect this semantic. To fix this, add a tried_applied flag to 'struct damos' that is set whenever a scheme passes all guard checks and is considered for application in damon_do_apply_schemes(). Then, increment nr_snapshots based on this flag in kdamond_apply_schemes() after the walk completes. This ensures nr_snapshots accurately reflects the number of snapshots where the scheme was actually tried. Signed-off-by: Liew Rui Yan <[email protected]> --- include/linux/damon.h | 2 ++ mm/damon/core.c | 12 ++++-------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/include/linux/damon.h b/include/linux/damon.h index 0c8b7ddef9ab..01e899a2150c 100644 --- a/include/linux/damon.h +++ b/include/linux/damon.h @@ -573,6 +573,8 @@ struct damos { unsigned long next_apply_sis; /* informs if ongoing DAMOS walk for this scheme is finished */ bool walk_completed; + /* informs if damos is tried applied in this phase */ + bool tried_applied; /* * If the current region in the filtering stage is allowed by core * layer-handled filters. If true, operations layer allows it, too. diff --git a/mm/damon/core.c b/mm/damon/core.c index 644daf5a1656..7230483e771f 100644 --- a/mm/damon/core.c +++ b/mm/damon/core.c @@ -398,12 +398,6 @@ static void damon_destroy_region(struct damon_region *r, damon_free_region(r); } -static bool damon_is_last_region(struct damon_region *r, - struct damon_target *t) -{ - return list_is_last(&r->list, &t->regions_list); -} - /** * damon_probe_hits_wsum() - Returns probe hits weighted sum of a region. * @r: region to get the weighted sum of. @@ -2668,8 +2662,7 @@ static void damon_do_apply_schemes(struct damon_ctx *c, if (damos_valid_target(c, r, s)) damos_apply_scheme(c, t, r, s); - if (damon_is_last_region(r, t)) - s->stat.nr_snapshots++; + s->tried_applied = true; } } @@ -3249,6 +3242,9 @@ static void kdamond_apply_schemes(struct damon_ctx *c) damon_for_each_scheme(s, c) { if (time_before(c->passed_sample_intervals, s->next_apply_sis)) continue; + if (s->tried_applied) + s->stat.nr_snapshots++; + s->tried_applied = false; damos_walk_complete(c, s); damos_set_next_apply_sis(s, c); s->last_applied = NULL; -- 2.55.0