aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorHong-Mei Li <a21834@motorola.com>2015-06-01 18:58:42 -0700
committerSimon Shields <keepcalm444@gmail.com>2016-06-13 14:47:38 +1000
commit8f5f33a7fd66e85d8d8502b5ee9c1c731ff0aeb5 (patch)
tree1227468de4d3ed8e716800da7113511edee8d41e /fs
parent51ec83132ab250883b0a1393dd73cbfdb92226cb (diff)
downloadkernel_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.c9
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;