[PATCH] kthread: fix task state in kthread worker if being frozen
From: Chen Yu
Date: Mon Aug 19 2024 - 10:20:06 EST
It was reported that during cpu hotplug test, the following
error was triggered:
do not call blocking ops when !TASK_RUNNING; state=1 set at kthread_worker_fn (kernel/kthread.c:?)
WARNING: CPU: 1 PID: 674 at kernel/sched/core.c:8469 __might_sleep
handle_bug
exc_invalid_op
asm_exc_invalid_op
__might_sleep
__might_sleep
kthread_worker_fn
kthread_worker_fn
kthread
__cfi_kthread_worker_fn
ret_from_fork
__cfi_kthread
ret_from_fork_asm
Peter pointed out that there is a race condition when the kworker is being
frozen and falls into try_to_freeze() with TASK_INTERRUPTIBLE, which
triggeres the warning.
Fix this by explicitly set the TASK_RUNNING before entering try_to_freeze().
Fixes: b56c0d8937e6 ("kthread: implement kthread_worker")
Reported-by: kernel test robot <oliver.sang@xxxxxxxxx>
Closes: https://lore.kernel.org/oe-lkp/202408161619.9ed8b83e-lkp@xxxxxxxxx
Suggested-by: Peter Zijlstra <peterz@xxxxxxxxxxxxx>
Signed-off-by: Chen Yu <yu.c.chen@xxxxxxxxx>
---
kernel/kthread.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/kernel/kthread.c b/kernel/kthread.c
index f7be976ff88a..06ab3ada9cf1 100644
--- a/kernel/kthread.c
+++ b/kernel/kthread.c
@@ -848,6 +848,12 @@ int kthread_worker_fn(void *worker_ptr)
} else if (!freezing(current))
schedule();
+ /*
+ * Explicitly set the running state in case we are being
+ * frozen and skip the schedule() above. try_to_freeze()
+ * expects the current task to be in the running state.
+ */
+ __set_current_state(TASK_RUNNING);
try_to_freeze();
cond_resched();
goto repeat;
--
2.25.1