]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
mm/damon/core: add damon_reset_aggregated() debug_sanity check
authorSeongJae Park <sj@kernel.org>
Fri, 6 Mar 2026 15:29:11 +0000 (07:29 -0800)
committerAndrew Morton <akpm@linux-foundation.org>
Sun, 5 Apr 2026 20:53:21 +0000 (13:53 -0700)
At time of damon_reset_aggregated(), aggregation of the interval should be
completed, and hence nr_accesses and nr_accesses_bp should match.  I found
a few bugs caused it to be broken in the past, from online parameters
update and complicated nr_accesses handling changes.  Add a sanity check
for that under CONFIG_DAMON_DEBUG_SANITY.

Link: https://lkml.kernel.org/r/20260306152914.86303-9-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 f3e5400914cb47fd2e3ee2213c842aa78febd6a5..66d8e9b1adcfced574c8d3543c04cef11bc21593 100644 (file)
@@ -1668,6 +1668,23 @@ static void damon_warn_fix_nr_accesses_corruption(struct damon_region *r)
        r->nr_accesses_bp = r->nr_accesses * 10000;
 }
 
+#ifdef CONFIG_DAMON_DEBUG_SANITY
+static void damon_verify_reset_aggregated(struct damon_region *r,
+               struct damon_ctx *c)
+{
+       WARN_ONCE(r->nr_accesses_bp != r->last_nr_accesses * 10000,
+                       "nr_accesses_bp %u last_nr_accesses %u sis %lu %lu\n",
+                       r->nr_accesses_bp, r->last_nr_accesses,
+                       c->passed_sample_intervals, c->next_aggregation_sis);
+}
+#else
+static void damon_verify_reset_aggregated(struct damon_region *r,
+               struct damon_ctx *c)
+{
+}
+#endif
+
+
 /*
  * Reset the aggregated monitoring results ('nr_accesses' of each region).
  */
@@ -1684,6 +1701,7 @@ static void kdamond_reset_aggregated(struct damon_ctx *c)
                        damon_warn_fix_nr_accesses_corruption(r);
                        r->last_nr_accesses = r->nr_accesses;
                        r->nr_accesses = 0;
+                       damon_verify_reset_aggregated(r, c);
                }
                ti++;
        }