summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSeongJae Park <sj@kernel.org>2026-03-06 18:29:08 +0300
committerAndrew Morton <akpm@linux-foundation.org>2026-04-05 23:53:20 +0300
commit0bb7682fdb533be8412e5678eab246144d855138 (patch)
tree6a8a2f052882fe39d033596b67a91dc60d9e9a51
parent242a764abe149f297273be18fdb66cfeaf27dec2 (diff)
downloadlinux-0bb7682fdb533be8412e5678eab246144d855138.tar.xz
mm/damon/core: add damon_merge_two_regions() debug_sanity check
A data corruption could cause damon_merge_two_regions() creating zero length DAMON regions. Add a sanity check for that under CONFIG_DAMON_DEBUG_SANITY. Link: https://lkml.kernel.org/r/20260306152914.86303-6-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.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/mm/damon/core.c b/mm/damon/core.c
index 16bedde920f0..0fa694aff617 100644
--- a/mm/damon/core.c
+++ b/mm/damon/core.c
@@ -2475,6 +2475,21 @@ static void kdamond_apply_schemes(struct damon_ctx *c)
mutex_unlock(&c->walk_control_lock);
}
+#ifdef CONFIG_DAMON_DEBUG_SANITY
+static void damon_verify_merge_two_regions(
+ struct damon_region *l, struct damon_region *r)
+{
+ /* damon_merge_two_regions() may created incorrect left region */
+ WARN_ONCE(l->ar.start >= l->ar.end, "l: %lu-%lu, r: %lu-%lu\n",
+ l->ar.start, l->ar.end, r->ar.start, r->ar.end);
+}
+#else
+static void damon_verify_merge_two_regions(
+ struct damon_region *l, struct damon_region *r)
+{
+}
+#endif
+
/*
* Merge two adjacent regions into one region
*/
@@ -2488,6 +2503,7 @@ static void damon_merge_two_regions(struct damon_target *t,
l->nr_accesses_bp = l->nr_accesses * 10000;
l->age = (l->age * sz_l + r->age * sz_r) / (sz_l + sz_r);
l->ar.end = r->ar.end;
+ damon_verify_merge_two_regions(l, r);
damon_destroy_region(r, t);
}