]> git.baikalelectronics.ru Git - kernel.git/commitdiff
mm/damon/core: finish kdamond as soon as any callback returns an error
authorSeongJae Park <sj@kernel.org>
Tue, 10 May 2022 01:20:54 +0000 (18:20 -0700)
committerAndrew Morton <akpm@linux-foundation.org>
Fri, 13 May 2022 14:20:08 +0000 (07:20 -0700)
When 'after_sampling()' or 'after_aggregation()' DAMON callbacks return an
error, kdamond continues the remaining loop once.  It makes no much sense
to run the remaining part while something wrong already happened.  The
context might be corrupted or having invalid data.  This commit therefore
makes kdamond skips the remaining works and immediately finish in the
cases.

Link: https://lkml.kernel.org/r/20220429160606.127307-3-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 44fe7e452a1ef4daf0a3e41c1dc7c3eac8b1aeab..b6daaff37bece477dde5b0ffc62e78d3cafded89 100644 (file)
@@ -1089,8 +1089,10 @@ static int kdamond_fn(void *data)
                if (ctx->ops.prepare_access_checks)
                        ctx->ops.prepare_access_checks(ctx);
                if (ctx->callback.after_sampling &&
-                               ctx->callback.after_sampling(ctx))
+                               ctx->callback.after_sampling(ctx)) {
                        done = true;
+                       continue;
+               }
 
                kdamond_usleep(ctx->sample_interval);
 
@@ -1102,8 +1104,10 @@ static int kdamond_fn(void *data)
                                        max_nr_accesses / 10,
                                        sz_limit);
                        if (ctx->callback.after_aggregation &&
-                                       ctx->callback.after_aggregation(ctx))
+                                       ctx->callback.after_aggregation(ctx)) {
                                done = true;
+                               continue;
+                       }
                        kdamond_apply_schemes(ctx);
                        kdamond_reset_aggregated(ctx);
                        kdamond_split_regions(ctx);