pidns: Wait in zap_pid_ns_processes until pid_ns->nr_hashed == 1
Looking at pid_ns->nr_hashed is a bit simpler and it works for disjoint process trees that an unshare or a join of a pid_namespace may create. Acked-by: "Serge E. Hallyn" <serge@hallyn.com> Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
This commit is contained in:
16
kernel/pid.c
16
kernel/pid.c
@ -273,10 +273,20 @@ void free_pid(struct pid *pid)
|
||||
spin_lock_irqsave(&pidmap_lock, flags);
|
||||
for (i = 0; i <= pid->level; i++) {
|
||||
struct upid *upid = pid->numbers + i;
|
||||
struct pid_namespace *ns = upid->ns;
|
||||
hlist_del_rcu(&upid->pid_chain);
|
||||
if (--upid->ns->nr_hashed == 0) {
|
||||
upid->ns->nr_hashed = -1;
|
||||
schedule_work(&upid->ns->proc_work);
|
||||
switch(--ns->nr_hashed) {
|
||||
case 1:
|
||||
/* When all that is left in the pid namespace
|
||||
* is the reaper wake up the reaper. The reaper
|
||||
* may be sleeping in zap_pid_ns_processes().
|
||||
*/
|
||||
wake_up_process(ns->child_reaper);
|
||||
break;
|
||||
case 0:
|
||||
ns->nr_hashed = -1;
|
||||
schedule_work(&ns->proc_work);
|
||||
break;
|
||||
}
|
||||
}
|
||||
spin_unlock_irqrestore(&pidmap_lock, flags);
|
||||
|
Reference in New Issue
Block a user