Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

mm/damon/core: handle damon_call_control as normal under kdmond deactivation

DAMON sysfs interface internally uses damon_call() to update DAMON
parameters as users requested, online. However, DAMON core cancels any
damon_call() requests when it is deactivated by DAMOS watermarks.

As a result, users cannot change DAMON parameters online while DAMON is
deactivated. Note that users can turn DAMON off and on with different
watermarks to work around. Since deactivated DAMON is nearly same to
stopped DAMON, the work around should have no big problem. Anyway, a bug
is a bug.

There is no real good reason to cancel the damon_call() request under
DAMOS deactivation. Fix it by simply handling the request as normal,
rather than cancelling under the situation.

Link: https://lkml.kernel.org/r/20250629204914.54114-1-sj@kernel.org
Fixes: 42b7491af14c ("mm/damon/core: introduce damon_call()")
Signed-off-by: SeongJae Park <sj@kernel.org>
Cc: <stable@vger.kernel.org> [6.14+]
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

authored by

SeongJae Park and committed by
Andrew Morton
bb1b5929 ddd05742

+3 -4
+3 -4
mm/damon/core.c
··· 2355 2355 * 2356 2356 * If there is a &struct damon_call_control request that registered via 2357 2357 * &damon_call() on @ctx, do or cancel the invocation of the function depending 2358 - * on @cancel. @cancel is set when the kdamond is deactivated by DAMOS 2359 - * watermarks, or the kdamond is already out of the main loop and therefore 2360 - * will be terminated. 2358 + * on @cancel. @cancel is set when the kdamond is already out of the main loop 2359 + * and therefore will be terminated. 2361 2360 */ 2362 2361 static void kdamond_call(struct damon_ctx *ctx, bool cancel) 2363 2362 { ··· 2404 2405 if (ctx->callback.after_wmarks_check && 2405 2406 ctx->callback.after_wmarks_check(ctx)) 2406 2407 break; 2407 - kdamond_call(ctx, true); 2408 + kdamond_call(ctx, false); 2408 2409 damos_walk_cancel(ctx); 2409 2410 } 2410 2411 return -EBUSY;