diff options
Diffstat (limited to 'kernel/exit.c')
| -rw-r--r-- | kernel/exit.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/kernel/exit.c b/kernel/exit.c index bc0ec674d3f4..6c2eeb8f6390 100644 --- a/kernel/exit.c +++ b/kernel/exit.c | |||
| @@ -127,6 +127,11 @@ static void __exit_signal(struct task_struct *tsk) | |||
| 127 | } | 127 | } |
| 128 | } | 128 | } |
| 129 | 129 | ||
| 130 | static void delayed_put_task_struct(struct rcu_head *rhp) | ||
| 131 | { | ||
| 132 | put_task_struct(container_of(rhp, struct task_struct, rcu)); | ||
| 133 | } | ||
| 134 | |||
| 130 | void release_task(struct task_struct * p) | 135 | void release_task(struct task_struct * p) |
| 131 | { | 136 | { |
| 132 | int zap_leader; | 137 | int zap_leader; |
| @@ -168,7 +173,7 @@ repeat: | |||
| 168 | spin_unlock(&p->proc_lock); | 173 | spin_unlock(&p->proc_lock); |
| 169 | proc_pid_flush(proc_dentry); | 174 | proc_pid_flush(proc_dentry); |
| 170 | release_thread(p); | 175 | release_thread(p); |
| 171 | put_task_struct(p); | 176 | call_rcu(&p->rcu, delayed_put_task_struct); |
| 172 | 177 | ||
| 173 | p = leader; | 178 | p = leader; |
| 174 | if (unlikely(zap_leader)) | 179 | if (unlikely(zap_leader)) |
