summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSeongJae Park <sj@kernel.org>2026-03-06 18:29:09 +0300
committerAndrew Morton <akpm@linux-foundation.org>2026-04-05 23:53:20 +0300
commitc070da23913f66b7c08340a137622ba2f2203616 (patch)
tree6b1c8d459929385906d71363e441f8dd94812067
parent0bb7682fdb533be8412e5678eab246144d855138 (diff)
downloadlinux-c070da23913f66b7c08340a137622ba2f2203616.tar.xz
mm/damon/core: add damon_merge_regions_of() debug_sanity check
damon_merge_regions_of() should be called only after aggregation is finished and therefore each region's nr_accesses and nr_accesses_bp match. There were bugs that broke the assumption, during development of online DAMON parameter updates and monitoring results handling changes. Add a sanity check for that under CONFIG_DAMON_DEBUG_SANITY. Link: https://lkml.kernel.org/r/20260306152914.86303-7-sj@kernel.org Signed-off-by: SeongJae Park <sj@kernel.org> Cc: Brendan Higgins <brendan.higgins@linux.dev> Cc: David Gow <davidgow@google.com> Cc: Shuah Khan <shuah@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
-rw-r--r--mm/damon/core.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/mm/damon/core.c b/mm/damon/core.c
index 0fa694aff617..3f55dfcb54e4 100644
--- a/mm/damon/core.c
+++ b/mm/damon/core.c
@@ -2507,6 +2507,20 @@ static void damon_merge_two_regions(struct damon_target *t,
damon_destroy_region(r, t);
}
+#ifdef CONFIG_DAMON_DEBUG_SANITY
+static void damon_verify_merge_regions_of(struct damon_region *r)
+{
+ WARN_ONCE(r->nr_accesses != r->nr_accesses_bp / 10000,
+ "nr_accesses (%u) != nr_accesses_bp (%u)\n",
+ r->nr_accesses, r->nr_accesses_bp);
+}
+#else
+static void damon_verify_merge_regions_of(struct damon_region *r)
+{
+}
+#endif
+
+
/*
* Merge adjacent regions having similar access frequencies
*
@@ -2520,6 +2534,7 @@ static void damon_merge_regions_of(struct damon_target *t, unsigned int thres,
struct damon_region *r, *prev = NULL, *next;
damon_for_each_region_safe(r, next, t) {
+ damon_verify_merge_regions_of(r);
if (abs(r->nr_accesses - r->last_nr_accesses) > thres)
r->age = 0;
else if ((r->nr_accesses == 0) != (r->last_nr_accesses == 0))