summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2019-02-13 15:59:20 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2019-02-13 15:59:19 -0800
commit785e337e69484af1ada967bc41ae778c413695dd (patch)
tree00056309c227359bb88367cf4bd9c726341ca9ce /kernel
parente2a34f151c7bc7adb99fb673973fbef69e63dce6 (diff)
parentb4248fb5b9970c6c6ae704c5e910250170608c8d (diff)
Merge "Merge android-4.4.173 (64b5644) into msm-4.4"
Diffstat (limited to 'kernel')
-rw-r--r--kernel/exit.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/kernel/exit.c b/kernel/exit.c
index fc82e495b729..8e288e8e9ca3 100644
--- a/kernel/exit.c
+++ b/kernel/exit.c
@@ -457,12 +457,14 @@ static struct task_struct *find_alive_thread(struct task_struct *p)
return NULL;
}
-static struct task_struct *find_child_reaper(struct task_struct *father)
+static struct task_struct *find_child_reaper(struct task_struct *father,
+ struct list_head *dead)
__releases(&tasklist_lock)
__acquires(&tasklist_lock)
{
struct pid_namespace *pid_ns = task_active_pid_ns(father);
struct task_struct *reaper = pid_ns->child_reaper;
+ struct task_struct *p, *n;
if (likely(reaper != father))
return reaper;
@@ -478,6 +480,12 @@ static struct task_struct *find_child_reaper(struct task_struct *father)
panic("Attempted to kill init! exitcode=0x%08x\n",
father->signal->group_exit_code ?: father->exit_code);
}
+
+ list_for_each_entry_safe(p, n, dead, ptrace_entry) {
+ list_del_init(&p->ptrace_entry);
+ release_task(p);
+ }
+
zap_pid_ns_processes(pid_ns);
write_lock_irq(&tasklist_lock);
@@ -564,7 +572,7 @@ static void forget_original_parent(struct task_struct *father,
exit_ptrace(father, dead);
/* Can drop and reacquire tasklist_lock */
- reaper = find_child_reaper(father);
+ reaper = find_child_reaper(father, dead);
if (list_empty(&father->children))
return;