diff options
author | Hong-Mei Li <a21834@motorola.com> | 2015-06-01 18:58:42 -0700 |
---|---|---|
committer | Simon Shields <keepcalm444@gmail.com> | 2016-06-13 14:47:38 +1000 |
commit | 8f5f33a7fd66e85d8d8502b5ee9c1c731ff0aeb5 (patch) | |
tree | 1227468de4d3ed8e716800da7113511edee8d41e /fs | |
parent | 51ec83132ab250883b0a1393dd73cbfdb92226cb (diff) | |
download | kernel_samsung_smdk4412-8f5f33a7fd66e85d8d8502b5ee9c1c731ff0aeb5.tar.gz kernel_samsung_smdk4412-8f5f33a7fd66e85d8d8502b5ee9c1c731ff0aeb5.tar.bz2 kernel_samsung_smdk4412-8f5f33a7fd66e85d8d8502b5ee9c1c731ff0aeb5.zip |
fs: avoid adding non-thread-group task to LMK rbtree
To maintain the task adj RB tree, we add a task to the RB tree when fork,
and delete it when exit. The place is exactly the same as the linear
p->tasks list, say, nly when the task is thread_group_leader.
When task group_leader is changing, we make sure to add the new leader
into RB tree after its leader flag is set, task->exit_signal.
Cherry-picked from (CR): http://gerrit.mot.com/753419/
Change-Id: I8da47998510e531188feb067b491e92306be9414
Signed-off-by: Hong-Mei Li <a21834@motorola.com>
Reviewed-on: http://gerrit.mot.com/753419
SLTApproved: Slta Waiver <sltawvr@motorola.com>
SME-Granted: SME Approvals Granted
Tested-by: Jira Key <jirakey@motorola.com>
Reviewed-by: Zhi-Ming Yuan <a14194@motorola.com>
Reviewed-by: Yi-Wei Zhao <gbjc64@motorola.com>
Submit-Approved: Jira Key <jirakey@motorola.com>
Reviewed-on: http://gerrit.mot.com/766106
Reviewed-by: Sudharsan Yettapu <sudharsan.yettapu@motorola.com>
Reviewed-by: Ravikumar Vembu <raviv@motorola.com>
(cherry picked from commit e9e92d64142625981490dd5c323aa08467d349e8)
Reviewed-on: http://gerrit.mot.com/768301
Conflicts:
fs/exec.c
Diffstat (limited to 'fs')
-rw-r--r-- | fs/exec.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/fs/exec.c b/fs/exec.c index 807400fd9f4..f0d744a455d 100644 --- a/fs/exec.c +++ b/fs/exec.c @@ -963,6 +963,15 @@ static int de_thread(struct task_struct *tsk) leader->group_leader = tsk; tsk->exit_signal = SIGCHLD; + /* + * need to delete leader from adj tree, because it will not be + * group leader (exit_signal = -1) soon. release_task(leader) + * can't delete it. + */ + spin_lock_irq(lock); + delete_from_adj_tree(leader); + add_2_adj_tree(tsk); + spin_unlock_irq(lock); BUG_ON(leader->exit_state != EXIT_ZOMBIE); leader->exit_state = EXIT_DEAD; |