]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
mm/damon/core: add kdamond_call() debug_sanity check
authorSeongJae Park <sj@kernel.org>
Fri, 22 May 2026 15:40:19 +0000 (08:40 -0700)
committerAndrew Morton <akpm@linux-foundation.org>
Thu, 4 Jun 2026 21:45:01 +0000 (14:45 -0700)
kdamond_call() is the place where DAMON API callers are allowed to access
the DAMON context's public internal state including the monitoring
results.  Hence it is important to ensure it is called with the expected
DAMON context state.  Do the check under DAMON_DEBUG_SANITY.

Link: https://lore.kernel.org/20260522154026.80546-9-sj@kernel.org
Signed-off-by: SeongJae Park <sj@kernel.org>
Cc: Brendan Higgins <brendan.higgins@linux.dev>
Cc: Shuah Khan <shuah@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/damon/core.c

index d816679dd7020139d40fc619713a0136024637f7..00e2997524ece1cbbc620b6d43c07645203127cf 100644 (file)
@@ -3329,6 +3329,37 @@ static void kdamond_usleep(unsigned long usecs)
                usleep_range_idle(usecs, usecs + 1);
 }
 
+#ifdef CONFIG_DAMON_DEBUG_SANITY
+static void damon_verify_ctx(struct damon_ctx *c)
+{
+       struct damon_target *t;
+       struct damon_region *r;
+
+       damon_for_each_target(t, c) {
+               struct damon_region *prev_r = NULL;
+               unsigned int nr_regions = 0;
+
+               damon_for_each_region(r, t) {
+                       WARN_ONCE(r->ar.start >= r->ar.end,
+                                       "region start (%lu) >= end (%lu)\n",
+                                       r->ar.start, r->ar.end);
+                       WARN_ONCE(prev_r && prev_r->ar.end > r->ar.start,
+                                       "region overlap (%lu > %lu)\n",
+                                       prev_r->ar.end, r->ar.start);
+                       prev_r = r;
+                       nr_regions++;
+               }
+               WARN_ONCE(damon_nr_regions(t) != nr_regions,
+                               "nr_regions mismatch: %u != %u\n",
+                               damon_nr_regions(t), nr_regions);
+       }
+}
+#else
+static void damon_verify_ctx(struct damon_ctx *c)
+{
+}
+#endif
+
 /*
  * kdamond_call() - handle damon_call_control objects.
  * @ctx:       The &struct damon_ctx of the kdamond.
@@ -3344,6 +3375,8 @@ static void kdamond_call(struct damon_ctx *ctx, bool cancel)
        struct damon_call_control *control, *next;
        LIST_HEAD(controls);
 
+       damon_verify_ctx(ctx);
+
        mutex_lock(&ctx->call_controls_lock);
        list_splice_tail_init(&ctx->call_controls, &controls);
        mutex_unlock(&ctx->call_controls_lock);