]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
mm/damon/core: use time_after_eq() in kdamond_fn()
authorSeongJae Park <sj@kernel.org>
Sat, 7 Mar 2026 19:49:14 +0000 (11:49 -0800)
committerAndrew Morton <akpm@linux-foundation.org>
Sun, 5 Apr 2026 20:53:22 +0000 (13:53 -0700)
damon_ctx->passed_sample_intervals and damon_ctx->next_*_sis are unsigned
long.  Those are compared in kdamond_fn() using normal comparison
operators.  It is unsafe from overflow.  Use time_after_eq(), which is
safe from overflows when correctly used, instead.

Link: https://lkml.kernel.org/r/20260307194915.203169-4-sj@kernel.org
Signed-off-by: SeongJae Park <sj@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/damon/core.c

index ac06465cd9eb4bc9581fb73bf2ce1cdf8079fffd..0c167bbc9c1c4b881534ec5fa0e698697fda32ce 100644 (file)
@@ -2921,7 +2921,8 @@ static int kdamond_fn(void *data)
                if (ctx->ops.check_accesses)
                        max_nr_accesses = ctx->ops.check_accesses(ctx);
 
-               if (ctx->passed_sample_intervals >= next_aggregation_sis) {
+               if (time_after_eq(ctx->passed_sample_intervals,
+                                       next_aggregation_sis)) {
                        kdamond_merge_regions(ctx,
                                        max_nr_accesses / 10,
                                        sz_limit);
@@ -2943,10 +2944,12 @@ static int kdamond_fn(void *data)
 
                sample_interval = ctx->attrs.sample_interval ?
                        ctx->attrs.sample_interval : 1;
-               if (ctx->passed_sample_intervals >= next_aggregation_sis) {
+               if (time_after_eq(ctx->passed_sample_intervals,
+                                       next_aggregation_sis)) {
                        if (ctx->attrs.intervals_goal.aggrs &&
-                                       ctx->passed_sample_intervals >=
-                                       ctx->next_intervals_tune_sis) {
+                                       time_after_eq(
+                                               ctx->passed_sample_intervals,
+                                               ctx->next_intervals_tune_sis)) {
                                /*
                                 * ctx->next_aggregation_sis might be updated
                                 * from kdamond_call().  In the case,
@@ -2980,7 +2983,8 @@ static int kdamond_fn(void *data)
                        kdamond_split_regions(ctx);
                }
 
-               if (ctx->passed_sample_intervals >= next_ops_update_sis) {
+               if (time_after_eq(ctx->passed_sample_intervals,
+                                       next_ops_update_sis)) {
                        ctx->next_ops_update_sis = next_ops_update_sis +
                                ctx->attrs.ops_update_interval /
                                sample_interval;