diff options
Diffstat (limited to 'kernel/pid.c')
-rw-r--r-- | kernel/pid.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/kernel/pid.c b/kernel/pid.c index d88b83eb703e..b3e6d7c41b97 100644 --- a/kernel/pid.c +++ b/kernel/pid.c | |||
@@ -34,6 +34,7 @@ | |||
34 | #include <linux/hash.h> | 34 | #include <linux/hash.h> |
35 | #include <linux/pid_namespace.h> | 35 | #include <linux/pid_namespace.h> |
36 | #include <linux/init_task.h> | 36 | #include <linux/init_task.h> |
37 | #include <linux/syscalls.h> | ||
37 | 38 | ||
38 | #define pid_hashfn(nr, ns) \ | 39 | #define pid_hashfn(nr, ns) \ |
39 | hash_long((unsigned long)nr + (unsigned long)ns, pidhash_shift) | 40 | hash_long((unsigned long)nr + (unsigned long)ns, pidhash_shift) |
@@ -567,6 +568,43 @@ void free_pid_ns(struct kref *kref) | |||
567 | put_pid_ns(parent); | 568 | put_pid_ns(parent); |
568 | } | 569 | } |
569 | 570 | ||
571 | void zap_pid_ns_processes(struct pid_namespace *pid_ns) | ||
572 | { | ||
573 | int nr; | ||
574 | int rc; | ||
575 | |||
576 | /* | ||
577 | * The last thread in the cgroup-init thread group is terminating. | ||
578 | * Find remaining pid_ts in the namespace, signal and wait for them | ||
579 | * to exit. | ||
580 | * | ||
581 | * Note: This signals each threads in the namespace - even those that | ||
582 | * belong to the same thread group, To avoid this, we would have | ||
583 | * to walk the entire tasklist looking a processes in this | ||
584 | * namespace, but that could be unnecessarily expensive if the | ||
585 | * pid namespace has just a few processes. Or we need to | ||
586 | * maintain a tasklist for each pid namespace. | ||
587 | * | ||
588 | */ | ||
589 | read_lock(&tasklist_lock); | ||
590 | nr = next_pidmap(pid_ns, 1); | ||
591 | while (nr > 0) { | ||
592 | kill_proc_info(SIGKILL, SEND_SIG_PRIV, nr); | ||
593 | nr = next_pidmap(pid_ns, nr); | ||
594 | } | ||
595 | read_unlock(&tasklist_lock); | ||
596 | |||
597 | do { | ||
598 | clear_thread_flag(TIF_SIGPENDING); | ||
599 | rc = sys_wait4(-1, NULL, __WALL, NULL); | ||
600 | } while (rc != -ECHILD); | ||
601 | |||
602 | |||
603 | /* Child reaper for the pid namespace is going away */ | ||
604 | pid_ns->child_reaper = NULL; | ||
605 | return; | ||
606 | } | ||
607 | |||
570 | /* | 608 | /* |
571 | * The pid hash table is scaled according to the amount of memory in the | 609 | * The pid hash table is scaled according to the amount of memory in the |
572 | * machine. From a minimum of 16 slots up to 4096 slots at one gigabyte or | 610 | * machine. From a minimum of 16 slots up to 4096 slots at one gigabyte or |