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.