]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
mm/damon/lru_sort: skip damon_call() if ctx has not started
authorSJ Park <sj@kernel.org>
Mon, 3 Aug 2026 13:46:45 +0000 (06:46 -0700)
committerAndrew Morton <akpm@linux-foundation.org>
Wed, 5 Aug 2026 03:02:03 +0000 (20:02 -0700)
DAMON_LRU_SORT calls damon_call() for commit_inputs parameter user input
if the DAMON context is initialized.  The context could be initialized,
but not yet successfully started.  In the case, damon_call() could
indefinitely hang.  Read the comment on damon_call() for more detail.  Fix
the problem by memorizing if the DAMON context has ever successfully
started, and skip damon_call() if it has not.

This issue can easily be reproduced by writing Y to the commit_inputs
parameter file on a system that DAMON_LRU_SORT has not turned on before.

Link: https://lore.kernel.org/20260803134646.16640-3-sj@kernel.org
Fixes: de3c60e1c831 ("mm/damon: add synchronous commit for commit_inputs")
Signed-off-by: SJ Park <sj@kernel.org>
Cc: Liew Rui Yan <aethernet65535@gmail.com>
Cc: <stable@vger.kernel.org> # 7.2.x
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/damon/lru_sort.c

index 120b3fe3fc9d5ef752d374da948cd839c8a6bdfe..729d94b8d77ef3ad2e32376a778789dbb05559bd 100644 (file)
@@ -351,6 +351,8 @@ static int damon_lru_sort_commit_inputs_fn(void *arg)
        return damon_lru_sort_apply_parameters();
 }
 
+static bool damon_lru_sort_damon_has_started;
+
 static int damon_lru_sort_commit_inputs_store(const char *val,
                                              const struct kernel_param *kp)
 {
@@ -371,11 +373,8 @@ static int damon_lru_sort_commit_inputs_store(const char *val,
        if (!commit_inputs_request)
                return 0;
 
-       /*
-        * Skip damon_call() if ctx is not initialized to avoid
-        * NULL pointer dereference.
-        */
-       if (!ctx)
+       /* Skip damon_call() if ctx has not successfully started. */
+       if (!damon_lru_sort_damon_has_started)
                return -EINVAL;
 
        err = damon_call(ctx, &control);
@@ -426,6 +425,8 @@ static int damon_lru_sort_turn(bool on)
        err = damon_start(&ctx, 1, true);
        if (err)
                return err;
+       if (!damon_lru_sort_damon_has_started)
+               damon_lru_sort_damon_has_started = true;
        return damon_call(ctx, &call_control);
 }