mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 02:32:09 -04:00
kmod: don't run async usermode helper as a child of kworker thread
call_usermodehelper_exec_sync() does fork() + wait() with "unignored"
SIGCHLD. What we have missed is that this worker thread can have other
children previously forked by call_usermodehelper_exec_work() without
UMH_WAIT_PROC. If such a child exits in between it becomes a zombie
because auto-reaping only works if SIGCHLD is ignored, and nobody can
reap it (unless/until this worker thread exits too).
Change the !UMH_WAIT_PROC case to use CLONE_PARENT.
Note: this is only first step. All PF_KTHREAD tasks, even created by
kernel_thread() should have ->parent == kthreadd by default.
Fixes: bb304a5c6f ("kmod: handle UMH_WAIT_PROC from system unbound workqueue")
Signed-off-by: Oleg Nesterov <[email protected]>
Acked-by: Frederic Weisbecker <[email protected]>
Cc: Rik van Riel <[email protected]>
Cc: Christoph Lameter <[email protected]>
Cc: Tejun Heo <[email protected]>
Cc: Rusty Russell <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
parent
8a70dd2669
commit
5211613978
1 changed files with 6 additions and 2 deletions
|
|
@ -327,9 +327,13 @@ static void call_usermodehelper_exec_work(struct work_struct *work)
|
|||
call_usermodehelper_exec_sync(sub_info);
|
||||
} else {
|
||||
pid_t pid;
|
||||
|
||||
/*
|
||||
* Use CLONE_PARENT to reparent it to kthreadd; we do not
|
||||
* want to pollute current->children, and we need a parent
|
||||
* that always ignores SIGCHLD to ensure auto-reaping.
|
||||
*/
|
||||
pid = kernel_thread(call_usermodehelper_exec_async, sub_info,
|
||||
SIGCHLD);
|
||||
CLONE_PARENT | SIGCHLD);
|
||||
if (pid < 0) {
|
||||
sub_info->retval = pid;
|
||||
umh_complete(sub_info);
|
||||
|
|
|
|||
Loading…
Reference in a new issue