]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
mm/damon/core: add damon_merge_two_regions() debug_sanity check
authorSeongJae Park <sj@kernel.org>
Fri, 6 Mar 2026 15:29:08 +0000 (07:29 -0800)
committerAndrew Morton <akpm@linux-foundation.org>
Sun, 5 Apr 2026 20:53:20 +0000 (13:53 -0700)
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>
mm/damon/core.c

index 16bedde920f037825d4ab53e03095d3afae4e4a9..0fa694aff61716abf30a80696fbbae2a781ed7b0 100644 (file)
@@ -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);
 }