Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 346310
b: refs/heads/master
c: af4b8a8
h: refs/heads/master
v: v3
  • Loading branch information
Eric W. Biederman committed Nov 19, 2012
1 parent 57ff284 commit a60c68d
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 27 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 5e1182deb81ae8c68494017c4a8a71811659c870
refs/heads/master: af4b8a83add95ef40716401395b44a1b579965f4
12 changes: 0 additions & 12 deletions trunk/kernel/exit.c
Original file line number Diff line number Diff line change
Expand Up @@ -72,18 +72,6 @@ static void __unhash_process(struct task_struct *p, bool group_dead)
list_del_rcu(&p->tasks);
list_del_init(&p->sibling);
__this_cpu_dec(process_counts);
/*
* If we are the last child process in a pid namespace to be
* reaped, notify the reaper sleeping zap_pid_ns_processes().
*/
if (IS_ENABLED(CONFIG_PID_NS)) {
struct task_struct *parent = p->real_parent;

if ((task_active_pid_ns(parent)->child_reaper == parent) &&
list_empty(&parent->children) &&
(parent->flags & PF_EXITING))
wake_up_process(parent);
}
}
list_del_rcu(&p->thread_group);
}
Expand Down
16 changes: 13 additions & 3 deletions trunk/kernel/pid.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
15 changes: 4 additions & 11 deletions trunk/kernel/pid_namespace.c
Original file line number Diff line number Diff line change
Expand Up @@ -217,22 +217,15 @@ void zap_pid_ns_processes(struct pid_namespace *pid_ns)

/*
* sys_wait4() above can't reap the TASK_DEAD children.
* Make sure they all go away, see __unhash_process().
* Make sure they all go away, see free_pid().
*/
for (;;) {
bool need_wait = false;

read_lock(&tasklist_lock);
if (!list_empty(&current->children)) {
__set_current_state(TASK_UNINTERRUPTIBLE);
need_wait = true;
}
read_unlock(&tasklist_lock);

if (!need_wait)
set_current_state(TASK_UNINTERRUPTIBLE);
if (pid_ns->nr_hashed == 1)
break;
schedule();
}
__set_current_state(TASK_RUNNING);

if (pid_ns->reboot)
current->signal->group_exit_code = pid_ns->reboot;
Expand Down

0 comments on commit a60c68d

Please sign in to comment.