]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
coredump_wait: don't call complete_vfork_done()
authorOleg Nesterov <oleg@redhat.com>
Mon, 22 Aug 2011 13:01:27 +0000 (15:01 +0200)
committerOleg Nesterov <oleg@redhat.com>
Mon, 22 Aug 2011 13:24:01 +0000 (15:24 +0200)
Now that CLONE_VFORK is killable, coredump_wait() no longer needs
complete_vfork_done(). zap_threads() should find and kill all tasks
with the same ->mm, this includes our parent if ->vfork_done is set.

mm_release() becomes the only caller, unexport complete_vfork_done().

Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Acked-by: Tejun Heo <tj@kernel.org>
fs/exec.c
include/linux/sched.h
kernel/fork.c

index 9bcc161c29830bf2ec214f54f54ed39cacf64d00..8433e5de1c700b2b24fe8b52aeb858309684da2e 100644 (file)
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -1925,19 +1925,9 @@ static int coredump_wait(int exit_code, struct core_state *core_state)
                core_waiters = zap_threads(tsk, mm, core_state, exit_code);
        up_write(&mm->mmap_sem);
 
-       if (unlikely(core_waiters < 0))
-               goto fail;
-
-       /*
-        * Make sure nobody is waiting for us to release the VM,
-        * otherwise we can deadlock when we wait on each other
-        */
-       if (tsk->vfork_done)
-               complete_vfork_done(tsk);
-
-       if (core_waiters)
+       if (core_waiters > 0)
                wait_for_completion(&core_state->startup);
-fail:
+
        return core_waiters;
 }
 
index e1ae5f7bf15a059893987c2ca0eb53bc35a4a46d..64bf566a75a70aba747fd2fb19a4eab3d125bca3 100644 (file)
@@ -2254,7 +2254,6 @@ extern int do_execve(const char *,
                     const char __user * const __user *,
                     const char __user * const __user *, struct pt_regs *);
 extern long do_fork(unsigned long, unsigned long, struct pt_regs *, unsigned long, int __user *, int __user *);
-extern void complete_vfork_done(struct task_struct *tsk);
 struct task_struct *fork_idle(int);
 
 extern void set_task_comm(struct task_struct *tsk, char *from);
index ca0bd1731ec049309492eca85503f055d54a5768..82418abe84adb07f3932545ceb9b79d1b4ce9a4d 100644 (file)
@@ -650,7 +650,7 @@ struct mm_struct *get_task_mm(struct task_struct *task)
 }
 EXPORT_SYMBOL_GPL(get_task_mm);
 
-void complete_vfork_done(struct task_struct *tsk)
+static void complete_vfork_done(struct task_struct *tsk)
 {
        struct completion *vfork;