diff options
| -rw-r--r-- | fs/exec.c | 2 | ||||
| -rw-r--r-- | include/linux/sched.h | 3 | ||||
| -rw-r--r-- | kernel/exit.c | 2 | ||||
| -rw-r--r-- | kernel/fork.c | 2 |
4 files changed, 4 insertions, 5 deletions
| @@ -712,7 +712,7 @@ static int de_thread(struct task_struct *tsk) | |||
| 712 | attach_pid(current, PIDTYPE_PID, current->pid); | 712 | attach_pid(current, PIDTYPE_PID, current->pid); |
| 713 | attach_pid(current, PIDTYPE_PGID, current->signal->pgrp); | 713 | attach_pid(current, PIDTYPE_PGID, current->signal->pgrp); |
| 714 | attach_pid(current, PIDTYPE_SID, current->signal->session); | 714 | attach_pid(current, PIDTYPE_SID, current->signal->session); |
| 715 | list_add_tail(¤t->tasks, &init_task.tasks); | 715 | list_add_tail_rcu(¤t->tasks, &init_task.tasks); |
| 716 | 716 | ||
| 717 | current->group_leader = current; | 717 | current->group_leader = current; |
| 718 | leader->group_leader = current; | 718 | leader->group_leader = current; |
diff --git a/include/linux/sched.h b/include/linux/sched.h index b7d31e2e1729..29b7d4f87d20 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
| @@ -1192,8 +1192,7 @@ extern void wait_task_inactive(task_t * p); | |||
| 1192 | #define remove_parent(p) list_del_init(&(p)->sibling) | 1192 | #define remove_parent(p) list_del_init(&(p)->sibling) |
| 1193 | #define add_parent(p) list_add_tail(&(p)->sibling,&(p)->parent->children) | 1193 | #define add_parent(p) list_add_tail(&(p)->sibling,&(p)->parent->children) |
| 1194 | 1194 | ||
| 1195 | #define next_task(p) list_entry((p)->tasks.next, struct task_struct, tasks) | 1195 | #define next_task(p) list_entry(rcu_dereference((p)->tasks.next), struct task_struct, tasks) |
| 1196 | #define prev_task(p) list_entry((p)->tasks.prev, struct task_struct, tasks) | ||
| 1197 | 1196 | ||
| 1198 | #define for_each_process(p) \ | 1197 | #define for_each_process(p) \ |
| 1199 | for (p = &init_task ; (p = next_task(p)) != &init_task ; ) | 1198 | for (p = &init_task ; (p = next_task(p)) != &init_task ; ) |
diff --git a/kernel/exit.c b/kernel/exit.c index 1a9787ac6173..f86434d7b3d1 100644 --- a/kernel/exit.c +++ b/kernel/exit.c | |||
| @@ -56,7 +56,7 @@ static void __unhash_process(struct task_struct *p) | |||
| 56 | detach_pid(p, PIDTYPE_PGID); | 56 | detach_pid(p, PIDTYPE_PGID); |
| 57 | detach_pid(p, PIDTYPE_SID); | 57 | detach_pid(p, PIDTYPE_SID); |
| 58 | 58 | ||
| 59 | list_del_init(&p->tasks); | 59 | list_del_rcu(&p->tasks); |
| 60 | __get_cpu_var(process_counts)--; | 60 | __get_cpu_var(process_counts)--; |
| 61 | } | 61 | } |
| 62 | list_del_rcu(&p->thread_group); | 62 | list_del_rcu(&p->thread_group); |
diff --git a/kernel/fork.c b/kernel/fork.c index 54b15f8cda53..34515772611e 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
| @@ -1204,7 +1204,7 @@ static task_t *copy_process(unsigned long clone_flags, | |||
| 1204 | attach_pid(p, PIDTYPE_PGID, process_group(p)); | 1204 | attach_pid(p, PIDTYPE_PGID, process_group(p)); |
| 1205 | attach_pid(p, PIDTYPE_SID, p->signal->session); | 1205 | attach_pid(p, PIDTYPE_SID, p->signal->session); |
| 1206 | 1206 | ||
| 1207 | list_add_tail(&p->tasks, &init_task.tasks); | 1207 | list_add_tail_rcu(&p->tasks, &init_task.tasks); |
| 1208 | __get_cpu_var(process_counts)++; | 1208 | __get_cpu_var(process_counts)++; |
| 1209 | } | 1209 | } |
| 1210 | attach_pid(p, PIDTYPE_PID, p->pid); | 1210 | attach_pid(p, PIDTYPE_PID, p->pid); |
