X-Git-Url: https://git.stricted.de/?a=blobdiff_plain;f=kernel%2Fexit.c;h=b75ebb365ce5ff39c27872e982ab47fc2001c64f;hb=6fa3eb70c07b7ce2061fd6602159ac2d45a7dc3d;hp=7bb73f9d09dbeedcc6c07f6a8dc8257f76fc4963;hpb=8aac62706adaaf0fab02c4327761561c8bda9448;p=GitHub%2Fmt8127%2Fandroid_kernel_alcatel_ttab.git diff --git a/kernel/exit.c b/kernel/exit.c index 7bb73f9d09db..b75ebb365ce5 100644 --- a/kernel/exit.c +++ b/kernel/exit.c @@ -59,6 +59,10 @@ #include #include +#ifdef CONFIG_MT_PRIO_TRACER +# include +#endif + static void exit_mm(struct task_struct * tsk); static void __unhash_process(struct task_struct *p, bool group_dead) @@ -74,6 +78,7 @@ static void __unhash_process(struct task_struct *p, bool group_dead) __this_cpu_dec(process_counts); } list_del_rcu(&p->thread_group); + list_del_rcu(&p->thread_node); } /* @@ -570,9 +575,6 @@ static void reparent_leader(struct task_struct *father, struct task_struct *p, struct list_head *dead) { list_move_tail(&p->sibling, &p->real_parent->children); - - if (p->exit_state == EXIT_DEAD) - return; /* * If this is a threaded reparent there is no need to * notify anyone anything has happened. @@ -580,9 +582,19 @@ static void reparent_leader(struct task_struct *father, struct task_struct *p, if (same_thread_group(p->real_parent, father)) return; - /* We don't want people slaying init. */ + /* + * We don't want people slaying init. + * + * Note: we do this even if it is EXIT_DEAD, wait_task_zombie() + * can change ->exit_state to EXIT_ZOMBIE. If this is the final + * state, do_notify_parent() was already called and ->exit_signal + * doesn't matter. + */ p->exit_signal = SIGCHLD; + if (p->exit_state == EXIT_DEAD) + return; + /* If it has exited notify the new parent about this child's death. */ if (!p->ptrace && p->exit_state == EXIT_ZOMBIE && thread_group_empty(p)) { @@ -704,12 +716,25 @@ static void check_stack_usage(void) static inline void check_stack_usage(void) {} #endif +#ifdef CONFIG_SCHEDSTATS +/* mt shceduler profiling*/ +extern void end_mtproc_info(struct task_struct *p); +#endif void do_exit(long code) { struct task_struct *tsk = current; int group_dead; profile_task_exit(tsk); +#ifdef CONFIG_SCHEDSTATS + /* mt shceduler profiling*/ + printk(KERN_DEBUG "[%d:%s] exit\n", tsk->pid, tsk->comm); + end_mtproc_info(tsk); +#endif + +#ifdef CONFIG_MT_PRIO_TRACER + delete_prio_tracer(tsk->pid); +#endif WARN_ON(blk_needs_flush_plug(tsk)); @@ -794,6 +819,8 @@ void do_exit(long code) exit_shm(tsk); exit_files(tsk); exit_fs(tsk); + if (group_dead) + disassociate_ctty(1); exit_task_namespaces(tsk); exit_task_work(tsk); check_stack_usage(); @@ -809,13 +836,9 @@ void do_exit(long code) cgroup_exit(tsk, 1); - if (group_dead) - disassociate_ctty(1); - module_put(task_thread_info(tsk)->exec_domain->module); proc_exit_connector(tsk); - /* * FIXME: do that only when needed, using sched_exit tracepoint */ @@ -835,7 +858,7 @@ void do_exit(long code) /* * Make sure we are holding no locks: */ - debug_check_no_locks_held(tsk); + debug_check_no_locks_held(); /* * We can do this unlocked here. The futex code uses this flag * just to verify whether the pi state cleanup has been done