lkml.org 
[lkml]   [2012]   [May]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    Date
    SubjectRe: [PATCH v2 -mm 1/1] pidns: find_new_reaper() can no longer switch to init_pid_ns.child_reaper
    Oleg Nesterov <oleg@redhat.com> writes:

    > find_new_reaper() changes pid_ns->child_reaper, see add0d4df
    > "pid_ns: zap_pid_ns_processes: fix the ->child_reaper changing".
    >
    > The original reason has gone away after the previous patch,
    > ->children list must be empty after zap_pid_ns_processes().
    >
    > However now we can not switch to init_pid_ns.child_reaper.
    > __unhash_process() relies on the "->child_reaper == parent"
    > check, but this check does not work if the last exiting task
    > is also the child reaper.
    >
    > As Eric sugested, we can change __unhash_process() to use the
    > parent's pid_ns and remove this code.
    >
    > Also, with this change we can move detach_pid(PIDTYPE_PID) back,
    > where it was before the previous fix.

    This looks good to me.

    Acked-by: "Eric W. Biederman" <ebiederm@xmission.com>

    I will be on the road for next two days so I don't expect I will
    be particularly active in this converation for a while.

    Eric


    > Signed-off-by: Oleg Nesterov <oleg@redhat.com>
    > ---
    > kernel/exit.c | 10 ++--------
    > 1 files changed, 2 insertions(+), 8 deletions(-)
    >
    > diff --git a/kernel/exit.c b/kernel/exit.c
    > index 6d66cd2..6424e6b 100644
    > --- a/kernel/exit.c
    > +++ b/kernel/exit.c
    > @@ -64,6 +64,7 @@ static void exit_mm(struct task_struct * tsk);
    > static void __unhash_process(struct task_struct *p, bool group_dead)
    > {
    > nr_threads--;
    > + detach_pid(p, PIDTYPE_PID);
    > if (group_dead) {
    > detach_pid(p, PIDTYPE_PGID);
    > detach_pid(p, PIDTYPE_SID);
    > @@ -79,13 +80,12 @@ static void __unhash_process(struct task_struct *p, bool group_dead)
    > if (IS_ENABLED(CONFIG_PID_NS)) {
    > struct task_struct *parent = p->real_parent;
    >
    > - if ((task_active_pid_ns(p)->child_reaper == parent) &&
    > + if ((task_active_pid_ns(parent)->child_reaper == parent) &&
    > list_empty(&parent->children) &&
    > (parent->flags & PF_EXITING))
    > wake_up_process(parent);
    > }
    > }
    > - detach_pid(p, PIDTYPE_PID);
    > list_del_rcu(&p->thread_group);
    > }
    >
    > @@ -732,12 +732,6 @@ static struct task_struct *find_new_reaper(struct task_struct *father)
    >
    > zap_pid_ns_processes(pid_ns);
    > write_lock_irq(&tasklist_lock);
    > - /*
    > - * We can not clear ->child_reaper or leave it alone.
    > - * There may by stealth EXIT_DEAD tasks on ->children,
    > - * forget_original_parent() must move them somewhere.
    > - */
    > - pid_ns->child_reaper = init_pid_ns.child_reaper;
    > } else if (father->signal->has_child_subreaper) {
    > struct task_struct *reaper;


    \
     
     \ /
      Last update: 2012-05-29 09:01    [from the cache]
    ©2003-2014 Jasper Spaans. Advertise on this site