Author: bdrewery
Date: Wed Oct 21 01:41:22 2015
New Revision: 289672
URL: https://svnweb.freebsd.org/changeset/base/289672

Log:
  MFC r288994:
  
    Remove redundant RFFPWAIT/vfork(2) handling in Linux fork(2) and clone(2)
    wrappers.

Modified:
  stable/10/sys/compat/linux/linux_fork.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/compat/linux/linux_fork.c
==============================================================================
--- stable/10/sys/compat/linux/linux_fork.c     Wed Oct 21 01:41:18 2015        
(r289671)
+++ stable/10/sys/compat/linux/linux_fork.c     Wed Oct 21 01:41:22 2015        
(r289672)
@@ -111,9 +111,8 @@ linux_vfork(struct thread *td, struct li
                printf(ARGS(vfork, ""));
 #endif
 
-       /* Exclude RFPPWAIT */
-       if ((error = fork1(td, RFFDG | RFPROC | RFMEM | RFSTOPPED, 0, &p2,
-           NULL, 0)) != 0)
+       if ((error = fork1(td, RFFDG | RFPROC | RFMEM | RFPPWAIT | RFSTOPPED,
+           0, &p2, NULL, 0)) != 0)
                return (error);
 
        td->td_retval[0] = p2->p_pid;
@@ -122,10 +121,6 @@ linux_vfork(struct thread *td, struct li
        if (error)
                return (error);
 
-       PROC_LOCK(p2);
-       p2->p_flag |= P_PPWAIT;
-       PROC_UNLOCK(p2);
-
        td2 = FIRST_THREAD_IN_PROC(p2);
 
        /*
@@ -136,12 +131,6 @@ linux_vfork(struct thread *td, struct li
        sched_add(td2, SRQ_BORING);
        thread_unlock(td2);
 
-       /* wait for the children to exit, ie. emulate vfork */
-       PROC_LOCK(p2);
-       while (p2->p_flag & P_PPWAIT)
-               cv_wait(&p2->p_pwait, &p2->p_mtx);
-       PROC_UNLOCK(p2);
-
        return (0);
 }
 
@@ -203,6 +192,9 @@ linux_clone(struct thread *td, struct li
                if (args->parent_tidptr == NULL)
                        return (EINVAL);
 
+       if (args->flags & LINUX_CLONE_VFORK)
+               ff |= RFPPWAIT;
+
        error = fork1(td, ff, 0, &p2, NULL, 0);
        if (error)
                return (error);
@@ -271,12 +263,6 @@ linux_clone(struct thread *td, struct li
                    "stack %p sig = %d"), (int)p2->p_pid, args->stack,
                    exit_signal);
 #endif
-       if (args->flags & LINUX_CLONE_VFORK) {
-               PROC_LOCK(p2);
-               p2->p_flag |= P_PPWAIT;
-               PROC_UNLOCK(p2);
-       }
-
        /*
         * Make this runnable after we are finished with it.
         */
@@ -288,13 +274,5 @@ linux_clone(struct thread *td, struct li
        td->td_retval[0] = p2->p_pid;
        td->td_retval[1] = 0;
 
-       if (args->flags & LINUX_CLONE_VFORK) {
-               /* wait for the children to exit, ie. emulate vfork */
-               PROC_LOCK(p2);
-               while (p2->p_flag & P_PPWAIT)
-                       cv_wait(&p2->p_pwait, &p2->p_mtx);
-               PROC_UNLOCK(p2);
-       }
-
        return (0);
 }
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to