[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20240819141551.111610-1-yu.c.chen@intel.com>
Date: Mon, 19 Aug 2024 22:15:51 +0800
From: Chen Yu <yu.c.chen@...el.com>
To: Andrew Morton <akpm@...ux-foundation.org>,
Peter Zijlstra <peterz@...radead.org>,
Andreas Gruenbacher <agruenba@...hat.com>,
Tejun Heo <tj@...nel.org>,
Shuah Khan <skhan@...uxfoundation.org>,
"Mickael Salaun" <mic@...ikod.net>,
linux-kernel@...r.kernel.org
Cc: Chen Yu <yu.chen.surf@...il.com>,
Chen Yu <yu.c.chen@...el.com>,
kernel test robot <oliver.sang@...el.com>
Subject: [PATCH] kthread: fix task state in kthread worker if being frozen
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@...el.com>
Closes: https://lore.kernel.org/oe-lkp/202408161619.9ed8b83e-lkp@intel.com
Suggested-by: Peter Zijlstra <peterz@...radead.org>
Signed-off-by: Chen Yu <yu.c.chen@...el.com>
---
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
Powered by blists - more mailing lists