Module Name:    src
Committed By:   christos
Date:           Fri Jul 27 20:52:49 UTC 2012

Modified Files:
        src/sys/kern: kern_exec.c kern_exit.c kern_fork.c

Log Message:
revert racy vfork() parent-blocking-before-child-execs-or-exits code.
ok rmind


To generate a diff of this commit:
cvs rdiff -u -r1.353 -r1.354 src/sys/kern/kern_exec.c
cvs rdiff -u -r1.239 -r1.240 src/sys/kern/kern_exit.c
cvs rdiff -u -r1.190 -r1.191 src/sys/kern/kern_fork.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/kern/kern_exec.c
diff -u src/sys/kern/kern_exec.c:1.353 src/sys/kern/kern_exec.c:1.354
--- src/sys/kern/kern_exec.c:1.353	Sun Jul 22 18:40:19 2012
+++ src/sys/kern/kern_exec.c	Fri Jul 27 16:52:49 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_exec.c,v 1.353 2012/07/22 22:40:19 rmind Exp $	*/
+/*	$NetBSD: kern_exec.c,v 1.354 2012/07/27 20:52:49 christos Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -59,7 +59,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_exec.c,v 1.353 2012/07/22 22:40:19 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_exec.c,v 1.354 2012/07/27 20:52:49 christos Exp $");
 
 #include "opt_exec.h"
 #include "opt_ktrace.h"
@@ -1180,6 +1180,7 @@ execve_runproc(struct lwp *l, struct exe
 	 * exited and exec()/exit() are the only places it will be cleared.
 	 */
 	if ((p->p_lflag & PL_PPWAIT) != 0) {
+#if 0
 		lwp_t *lp;
 
 		mutex_enter(proc_lock);
@@ -1192,6 +1193,13 @@ execve_runproc(struct lwp *l, struct exe
 		lp->l_pflag &= ~LP_VFORKWAIT; /* XXX */
 		cv_broadcast(&lp->l_waitcv);
 		mutex_exit(proc_lock);
+#else
+		mutex_enter(proc_lock);
+		l->l_lwpctl = NULL; /* was on loan from blocked parent */
+		p->p_lflag &= ~PL_PPWAIT;
+		cv_broadcast(&p->p_pptr->p_waitcv);
+		mutex_exit(proc_lock);
+#endif
 	}
 
 	/*

Index: src/sys/kern/kern_exit.c
diff -u src/sys/kern/kern_exit.c:1.239 src/sys/kern/kern_exit.c:1.240
--- src/sys/kern/kern_exit.c:1.239	Sun Jul 22 18:40:19 2012
+++ src/sys/kern/kern_exit.c	Fri Jul 27 16:52:49 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_exit.c,v 1.239 2012/07/22 22:40:19 rmind Exp $	*/
+/*	$NetBSD: kern_exit.c,v 1.240 2012/07/27 20:52:49 christos Exp $	*/
 
 /*-
  * Copyright (c) 1998, 1999, 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -67,7 +67,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_exit.c,v 1.239 2012/07/22 22:40:19 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_exit.c,v 1.240 2012/07/27 20:52:49 christos Exp $");
 
 #include "opt_ktrace.h"
 #include "opt_perfctrs.h"
@@ -330,6 +330,7 @@ exit1(struct lwp *l, int rv)
 	 */
 	mutex_enter(proc_lock);
 	if (p->p_lflag & PL_PPWAIT) {
+#if 0
 		lwp_t *lp;
 
 		l->l_lwpctl = NULL; /* was on loan from blocked parent */
@@ -339,6 +340,11 @@ exit1(struct lwp *l, int rv)
 		p->p_vforklwp = NULL;
 		lp->l_pflag &= ~LP_VFORKWAIT; /* XXX */
 		cv_broadcast(&lp->l_waitcv);
+#else
+		l->l_lwpctl = NULL; /* was on loan from blocked parent */
+		p->p_lflag &= ~PL_PPWAIT;
+		cv_broadcast(&p->p_pptr->p_waitcv);
+#endif
 	}
 
 	if (SESS_LEADER(p)) {

Index: src/sys/kern/kern_fork.c
diff -u src/sys/kern/kern_fork.c:1.190 src/sys/kern/kern_fork.c:1.191
--- src/sys/kern/kern_fork.c:1.190	Sun Jul 22 18:40:19 2012
+++ src/sys/kern/kern_fork.c	Fri Jul 27 16:52:49 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_fork.c,v 1.190 2012/07/22 22:40:19 rmind Exp $	*/
+/*	$NetBSD: kern_fork.c,v 1.191 2012/07/27 20:52:49 christos Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2001, 2004, 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -67,7 +67,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_fork.c,v 1.190 2012/07/22 22:40:19 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_fork.c,v 1.191 2012/07/27 20:52:49 christos Exp $");
 
 #include "opt_ktrace.h"
 
@@ -587,9 +587,14 @@ fork1(struct lwp *l1, int flags, int exi
 	 * Preserve synchronization semantics of vfork.  If waiting for
 	 * child to exec or exit, sleep until it clears LP_VFORKWAIT.
 	 */
+#if 0
 	while (l1->l_pflag & LP_VFORKWAIT) {
 		cv_wait(&l1->l_waitcv, proc_lock);
 	}
+#else
+	while (p2->p_lflag & PL_PPWAIT)
+		cv_wait(&p1->p_waitcv, proc_lock);
+#endif
 
 	/*
 	 * Let the parent know that we are tracing its child.

Reply via email to