aboutsummaryrefslogtreecommitdiff
path: root/tools/perf/scripts/python/export-to-postgresql.py
diff options
context:
space:
mode:
authorKirill Tkhai <[email protected]>2017-05-12 19:11:31 +0300
committerEric W. Biederman <[email protected]>2017-05-13 17:26:02 -0500
commit3fd37226216620c1a468afa999739d5016fbc349 (patch)
tree6ac4783bd114b147f9a5279086ea05670caa5b64 /tools/perf/scripts/python/export-to-postgresql.py
parentb9a985db98961ae1ba0be169f19df1c567e4ffe0 (diff)
pid_ns: Fix race between setns'ed fork() and zap_pid_ns_processes()
Imagine we have a pid namespace and a task from its parent's pid_ns, which made setns() to the pid namespace. The task is doing fork(), while the pid namespace's child reaper is dying. We have the race between them: Task from parent pid_ns Child reaper copy_process() .. alloc_pid() .. .. zap_pid_ns_processes() .. disable_pid_allocation() .. read_lock(&tasklist_lock) .. iterate over pids in pid_ns .. kill tasks linked to pids .. read_unlock(&tasklist_lock) write_lock_irq(&tasklist_lock); .. attach_pid(p, PIDTYPE_PID); .. .. .. So, just created task p won't receive SIGKILL signal, and the pid namespace will be in contradictory state. Only manual kill will help there, but does the userspace care about this? I suppose, the most users just inject a task into a pid namespace and wait a SIGCHLD from it. The patch fixes the problem. It simply checks for (pid_ns->nr_hashed & PIDNS_HASH_ADDING) in copy_process(). We do it under the tasklist_lock, and can't skip PIDNS_HASH_ADDING as noted by Oleg: "zap_pid_ns_processes() does disable_pid_allocation() and then takes tasklist_lock to kill the whole namespace. Given that copy_process() checks PIDNS_HASH_ADDING under write_lock(tasklist) they can't race; if copy_process() takes this lock first, the new child will be killed, otherwise copy_process() can't miss the change in ->nr_hashed." If allocation is disabled, we just return -ENOMEM like it's made for such cases in alloc_pid(). v2: Do not move disable_pid_allocation(), do not introduce a new variable in copy_process() and simplify the patch as suggested by Oleg Nesterov. Account the problem with double irq enabling found by Eric W. Biederman. Fixes: c876ad768215 ("pidns: Stop pid allocation when init dies") Signed-off-by: Kirill Tkhai <[email protected]> CC: Andrew Morton <[email protected]> CC: Ingo Molnar <[email protected]> CC: Peter Zijlstra <[email protected]> CC: Oleg Nesterov <[email protected]> CC: Mike Rapoport <[email protected]> CC: Michal Hocko <[email protected]> CC: Andy Lutomirski <[email protected]> CC: "Eric W. Biederman" <[email protected]> CC: Andrei Vagin <[email protected]> CC: Cyrill Gorcunov <[email protected]> CC: Serge Hallyn <[email protected]> Cc: [email protected] Acked-by: Oleg Nesterov <[email protected]> Signed-off-by: Eric W. Biederman <[email protected]>
Diffstat (limited to 'tools/perf/scripts/python/export-to-postgresql.py')
0 files changed, 0 insertions, 0 deletions