mirror of
https://github.com/torvalds/linux.git
synced 2024-12-24 11:51:27 +00:00
kthread: Fix task state in kthread worker if being frozen
When analyzing a kernel waring message, 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 could trigger a might_sleep() warning in try_to_freeze().
Although the root cause is not related to freeze()[1], it is still worthy to fix
this issue ahead.
One possible race scenario:
CPU 0 CPU 1
----- -----
// kthread_worker_fn
set_current_state(TASK_INTERRUPTIBLE);
suspend_freeze_processes()
freeze_processes
static_branch_inc(&freezer_active);
freeze_kernel_threads
pm_nosig_freezing = true;
if (work) { //false
__set_current_state(TASK_RUNNING);
} else if (!freezing(current)) //false, been frozen
freezing():
if (static_branch_unlikely(&freezer_active))
if (pm_nosig_freezing)
return true;
schedule()
}
// state is still TASK_INTERRUPTIBLE
try_to_freeze()
might_sleep() <--- warning
Fix this by explicitly set the TASK_RUNNING before entering
try_to_freeze().
Fixes: b56c0d8937
("kthread: implement kthread_worker")
Suggested-by: Peter Zijlstra <peterz@infradead.org>
Suggested-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Chen Yu <yu.c.chen@intel.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lore.kernel.org/lkml/Zs2ZoAcUsZMX2B%2FI@chenyu5-mobl2/ [1]
This commit is contained in:
parent
84d265281d
commit
6b9ccbc033
@ -845,8 +845,16 @@ repeat:
|
||||
* event only cares about the address.
|
||||
*/
|
||||
trace_sched_kthread_work_execute_end(work, func);
|
||||
} else if (!freezing(current))
|
||||
} else if (!freezing(current)) {
|
||||
schedule();
|
||||
} else {
|
||||
/*
|
||||
* Handle the case where the current remains
|
||||
* TASK_INTERRUPTIBLE. try_to_freeze() expects
|
||||
* the current to be TASK_RUNNING.
|
||||
*/
|
||||
__set_current_state(TASK_RUNNING);
|
||||
}
|
||||
|
||||
try_to_freeze();
|
||||
cond_resched();
|
||||
|
Loading…
Reference in New Issue
Block a user