svn commit: r288994 - head/sys/compat/linux

Bryan Drewery bdrewery at FreeBSD.org
Wed Oct 7 19:10:40 UTC 2015


Author: bdrewery
Date: Wed Oct  7 19:10:38 2015
New Revision: 288994
URL: https://svnweb.freebsd.org/changeset/base/288994

Log:
  Remove redundant RFFPWAIT/vfork(2) handling in Linux fork(2) and clone(2) wrappers.
  
  r161611 added some of the code from sys_vfork() directly into the Linux
  module wrappers since they use RFSTOPPED.  In r232240, the RFFPWAIT handling
  was moved to syscallret(), thus this code in the Linux module is no longer
  needed as it will be called later.
  
  This also allows the Linux wrappers to benefit from the fix in r275616 for
  threads not getting suspended if their vforked child is stopped while they
  wait on them.
  
  Reviewed by:	jhb, kib
  MFC after:	2 weeks
  Differential Revision:	https://reviews.freebsd.org/D3828

Modified:
  head/sys/compat/linux/linux_fork.c

Modified: head/sys/compat/linux/linux_fork.c
==============================================================================
--- head/sys/compat/linux/linux_fork.c	Wed Oct  7 17:52:18 2015	(r288993)
+++ head/sys/compat/linux/linux_fork.c	Wed Oct  7 19:10:38 2015	(r288994)
@@ -106,20 +106,14 @@ 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, NULL)) != 0)
+	if ((error = fork1(td, RFFDG | RFPROC | RFMEM | RFPPWAIT | RFSTOPPED,
+	    0, &p2, NULL, 0, NULL)) != 0)
 		return (error);
 
-
 	td2 = FIRST_THREAD_IN_PROC(p2);
 
 	linux_proc_init(td, td2, 0);
 
-	PROC_LOCK(p2);
-	p2->p_flag |= P_PPWAIT;
-	PROC_UNLOCK(p2);
-
    	td->td_retval[0] = p2->p_pid;
 
 	/*
@@ -130,12 +124,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);
 }
 
@@ -179,6 +167,9 @@ linux_clone_proc(struct thread *td, stru
 		if (args->parent_tidptr == NULL)
 			return (EINVAL);
 
+	if (args->flags & LINUX_CLONE_VFORK)
+		ff |= RFPPWAIT;
+
 	error = fork1(td, ff, 0, &p2, NULL, 0, NULL);
 	if (error)
 		return (error);
@@ -228,12 +219,6 @@ linux_clone_proc(struct thread *td, stru
 		    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.
 	 */
@@ -244,14 +229,6 @@ linux_clone_proc(struct thread *td, stru
 
 	td->td_retval[0] = p2->p_pid;
 
-	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);
 }
 


More information about the svn-src-head mailing list