|
@@ -163,27 +163,17 @@ static void delayed_put_task_struct(struct rcu_head *rhp)
|
|
|
put_task_struct(container_of(rhp, struct task_struct, rcu));
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- * Do final ptrace-related cleanup of a zombie being reaped.
|
|
|
- *
|
|
|
- * Called with write_lock(&tasklist_lock) held.
|
|
|
- */
|
|
|
-static void ptrace_release_task(struct task_struct *p)
|
|
|
-{
|
|
|
- BUG_ON(!list_empty(&p->ptraced));
|
|
|
- ptrace_unlink(p);
|
|
|
- BUG_ON(!list_empty(&p->ptrace_entry));
|
|
|
-}
|
|
|
|
|
|
void release_task(struct task_struct * p)
|
|
|
{
|
|
|
struct task_struct *leader;
|
|
|
int zap_leader;
|
|
|
repeat:
|
|
|
+ tracehook_prepare_release_task(p);
|
|
|
atomic_dec(&p->user->processes);
|
|
|
proc_flush_task(p);
|
|
|
write_lock_irq(&tasklist_lock);
|
|
|
- ptrace_release_task(p);
|
|
|
+ tracehook_finish_release_task(p);
|
|
|
__exit_signal(p);
|
|
|
|
|
|
/*
|
|
@@ -205,6 +195,13 @@ repeat:
|
|
|
* that case.
|
|
|
*/
|
|
|
zap_leader = task_detached(leader);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * This maintains the invariant that release_task()
|
|
|
+ * only runs on a task in EXIT_DEAD, just for sanity.
|
|
|
+ */
|
|
|
+ if (zap_leader)
|
|
|
+ leader->exit_state = EXIT_DEAD;
|
|
|
}
|
|
|
|
|
|
write_unlock_irq(&tasklist_lock);
|