]> err.no Git - linux-2.6/blobdiff - kernel/exit.c
Merge branch 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik...
[linux-2.6] / kernel / exit.c
index aea23e713cf46ec10b6f71bf038fd79bccd82e37..6c2eeb8f6390c1ae1daeb3b12ecd3aa974b3c599 100644 (file)
@@ -51,7 +51,6 @@ static void __unhash_process(struct task_struct *p)
 {
        nr_threads--;
        detach_pid(p, PIDTYPE_PID);
-       detach_pid(p, PIDTYPE_TGID);
        if (thread_group_leader(p)) {
                detach_pid(p, PIDTYPE_PGID);
                detach_pid(p, PIDTYPE_SID);
@@ -59,7 +58,7 @@ static void __unhash_process(struct task_struct *p)
                list_del_init(&p->tasks);
                __get_cpu_var(process_counts)--;
        }
-
+       list_del_rcu(&p->thread_group);
        remove_parent(p);
 }
 
@@ -115,10 +114,11 @@ static void __exit_signal(struct task_struct *tsk)
        __unhash_process(tsk);
 
        tsk->signal = NULL;
-       cleanup_sighand(tsk);
+       tsk->sighand = NULL;
        spin_unlock(&sighand->siglock);
        rcu_read_unlock();
 
+       __cleanup_sighand(sighand);
        clear_tsk_thread_flag(tsk,TIF_SIGPENDING);
        flush_sigqueue(&tsk->pending);
        if (sig) {
@@ -127,6 +127,11 @@ static void __exit_signal(struct task_struct *tsk)
        }
 }
 
+static void delayed_put_task_struct(struct rcu_head *rhp)
+{
+       put_task_struct(container_of(rhp, struct task_struct, rcu));
+}
+
 void release_task(struct task_struct * p)
 {
        int zap_leader;
@@ -168,7 +173,7 @@ repeat:
        spin_unlock(&p->proc_lock);
        proc_pid_flush(proc_dentry);
        release_thread(p);
-       put_task_struct(p);
+       call_rcu(&p->rcu, delayed_put_task_struct);
 
        p = leader;
        if (unlikely(zap_leader))
@@ -964,13 +969,6 @@ asmlinkage long sys_exit(int error_code)
        do_exit((error_code&0xff)<<8);
 }
 
-task_t fastcall *next_thread(const task_t *p)
-{
-       return pid_task(p->pids[PIDTYPE_TGID].pid_list.next, PIDTYPE_TGID);
-}
-
-EXPORT_SYMBOL(next_thread);
-
 /*
  * Take down every thread in the group.  This is called by fatal signals
  * as well as by sys_exit_group (below).