enum pid_type
 {
        PIDTYPE_PID,
-       PIDTYPE_TGID,
        PIDTYPE_PGID,
        PIDTYPE_SID,
        PIDTYPE_MAX
 
 
        /* PID/PID hash table linkage. */
        struct pid pids[PIDTYPE_MAX];
+       struct list_head thread_group;
 
        struct completion *vfork_done;          /* for vfork() */
        int __user *set_child_tid;              /* CLONE_CHILD_SETTID */
 #define while_each_thread(g, t) \
        while ((t = next_thread(t)) != g)
 
-extern task_t * FASTCALL(next_thread(const task_t *p));
-
 #define thread_group_leader(p) (p->pid == p->tgid)
 
+static inline task_t *next_thread(task_t *p)
+{
+       return list_entry(rcu_dereference(p->thread_group.next),
+                               task_t, thread_group);
+}
+
 static inline int thread_group_empty(task_t *p)
 {
-       return list_empty(&p->pids[PIDTYPE_TGID].pid_list);
+       return list_empty(&p->thread_group);
 }
 
 #define delay_group_leader(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);
                list_del_init(&p->tasks);
                __get_cpu_var(process_counts)--;
        }
-
+       list_del_rcu(&p->thread_group);
        remove_parent(p);
 }
 
        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).
 
         * We dont wake it up yet.
         */
        p->group_leader = p;
+       INIT_LIST_HEAD(&p->thread_group);
        INIT_LIST_HEAD(&p->ptrace_children);
        INIT_LIST_HEAD(&p->ptrace_list);
 
                        retval = -EAGAIN;
                        goto bad_fork_cleanup_namespace;
                }
+
                p->group_leader = current->group_leader;
+               list_add_tail_rcu(&p->thread_group, &p->group_leader->thread_group);
 
                if (current->signal->group_stop_count > 0) {
                        /*
                        list_add_tail(&p->tasks, &init_task.tasks);
                        __get_cpu_var(process_counts)++;
                }
-               attach_pid(p, PIDTYPE_TGID, p->tgid);
                attach_pid(p, PIDTYPE_PID, p->pid);
                nr_threads++;
        }