mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 18:51:56 -04:00
threadgroup: extend threadgroup_lock() to cover exit and exec
threadgroup_lock() protected only protected against new addition to
the threadgroup, which was inherently somewhat incomplete and
problematic for its only user cgroup. On-going migration could race
against exec and exit leading to interesting problems - the symmetry
between various attach methods, task exiting during method execution,
->exit() racing against attach methods, migrating task switching basic
properties during exec and so on.
This patch extends threadgroup_lock() such that it protects against
all three threadgroup altering operations - fork, exit and exec. For
exit, threadgroup_change_begin/end() calls are added to exit_signals
around assertion of PF_EXITING. For exec, threadgroup_[un]lock() are
updated to also grab and release cred_guard_mutex.
With this change, threadgroup_lock() guarantees that the target
threadgroup will remain stable - no new task will be added, no new
PF_EXITING will be set and exec won't happen.
The next patch will update cgroup so that it can take full advantage
of this change.
-v2: beefed up comment as suggested by Frederic.
-v3: narrowed scope of protection in exit path as suggested by
Frederic.
Signed-off-by: Tejun Heo <[email protected]>
Reviewed-by: KAMEZAWA Hiroyuki <[email protected]>
Acked-by: Li Zefan <[email protected]>
Acked-by: Frederic Weisbecker <[email protected]>
Cc: Oleg Nesterov <[email protected]>
Cc: Andrew Morton <[email protected]>
Cc: Paul Menage <[email protected]>
Cc: Linus Torvalds <[email protected]>
This commit is contained in:
parent
257058ae2b
commit
77e4ef99d1
2 changed files with 51 additions and 6 deletions
|
|
@ -2359,8 +2359,15 @@ void exit_signals(struct task_struct *tsk)
|
|||
int group_stop = 0;
|
||||
sigset_t unblocked;
|
||||
|
||||
/*
|
||||
* @tsk is about to have PF_EXITING set - lock out users which
|
||||
* expect stable threadgroup.
|
||||
*/
|
||||
threadgroup_change_begin(tsk);
|
||||
|
||||
if (thread_group_empty(tsk) || signal_group_exit(tsk->signal)) {
|
||||
tsk->flags |= PF_EXITING;
|
||||
threadgroup_change_end(tsk);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -2370,6 +2377,9 @@ void exit_signals(struct task_struct *tsk)
|
|||
* see wants_signal(), do_signal_stop().
|
||||
*/
|
||||
tsk->flags |= PF_EXITING;
|
||||
|
||||
threadgroup_change_end(tsk);
|
||||
|
||||
if (!signal_pending(tsk))
|
||||
goto out;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue