diff options
author | Tejun Heo <tj@kernel.org> | 2019-05-31 13:38:57 -0400 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2019-05-31 13:38:57 -0400 |
commit | 6b115bf58e6f013ca75e7115aabcbd56c20ff31d (patch) | |
tree | 965ef5bcab73bbeacdfe1fbed8408300d2ecbcea /kernel/exit.c | |
parent | 8cfeb385e9ebda784dccd447fe0f784464ca6ee1 (diff) |
cgroup: Call cgroup_release() before __exit_signal()
cgroup_release() calls cgroup_subsys->release() which is used by the
pids controller to uncharge its pid. We want to use it to manage
iteration of dying tasks which requires putting it before
__unhash_process(). Move cgroup_release() above __exit_signal().
While this makes it uncharge before the pid is freed, pid is RCU freed
anyway and the window is very narrow.
Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Oleg Nesterov <oleg@redhat.com>
Diffstat (limited to 'kernel/exit.c')
-rw-r--r-- | kernel/exit.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/kernel/exit.c b/kernel/exit.c index 1803efb2922f..a75b6a7f458a 100644 --- a/kernel/exit.c +++ b/kernel/exit.c | |||
@@ -195,6 +195,7 @@ repeat: | |||
195 | rcu_read_unlock(); | 195 | rcu_read_unlock(); |
196 | 196 | ||
197 | proc_flush_task(p); | 197 | proc_flush_task(p); |
198 | cgroup_release(p); | ||
198 | 199 | ||
199 | write_lock_irq(&tasklist_lock); | 200 | write_lock_irq(&tasklist_lock); |
200 | ptrace_release_task(p); | 201 | ptrace_release_task(p); |
@@ -220,7 +221,6 @@ repeat: | |||
220 | } | 221 | } |
221 | 222 | ||
222 | write_unlock_irq(&tasklist_lock); | 223 | write_unlock_irq(&tasklist_lock); |
223 | cgroup_release(p); | ||
224 | release_thread(p); | 224 | release_thread(p); |
225 | call_rcu(&p->rcu, delayed_put_task_struct); | 225 | call_rcu(&p->rcu, delayed_put_task_struct); |
226 | 226 | ||