Module Name: src Committed By: christos Date: Fri Nov 4 18:14:05 UTC 2016
Modified Files: src/sys/kern: kern_exit.c kern_fork.c sys_ptrace_common.c src/sys/sys: ptrace.h Log Message: deduplicate the complex lock reparent dance. To generate a diff of this commit: cvs rdiff -u -r1.262 -r1.263 src/sys/kern/kern_exit.c cvs rdiff -u -r1.195 -r1.196 src/sys/kern/kern_fork.c cvs rdiff -u -r1.1 -r1.2 src/sys/kern/sys_ptrace_common.c cvs rdiff -u -r1.48 -r1.49 src/sys/sys/ptrace.h 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_exit.c diff -u src/sys/kern/kern_exit.c:1.262 src/sys/kern/kern_exit.c:1.263 --- src/sys/kern/kern_exit.c:1.262 Fri Nov 4 14:12:06 2016 +++ src/sys/kern/kern_exit.c Fri Nov 4 14:14:04 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_exit.c,v 1.262 2016/11/04 18:12:06 christos Exp $ */ +/* $NetBSD: kern_exit.c,v 1.263 2016/11/04 18:14:04 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.262 2016/11/04 18:12:06 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_exit.c,v 1.263 2016/11/04 18:14:04 christos Exp $"); #include "opt_ktrace.h" #include "opt_dtrace.h" @@ -1205,6 +1205,33 @@ proc_free(struct proc *p, struct wrusage } /* + * Change the parent of a process for tracing purposes. + */ +void +proc_changeparent(struct proc *t, struct proc *p) +{ + SET(t->p_slflag, PSL_TRACED); + t->p_opptr = t->p_pptr; + if (t->p_pptr == p) + return; + struct proc *parent = t->p_pptr; + + if (parent->p_lock < t->p_lock) { + if (!mutex_tryenter(parent->p_lock)) { + mutex_exit(t->p_lock); + mutex_enter(parent->p_lock); + mutex_enter(t->p_lock); + } + } else if (parent->p_lock > t->p_lock) { + mutex_enter(parent->p_lock); + } + parent->p_slflag |= PSL_CHTRACED; + proc_reparent(t, p); + if (parent->p_lock != t->p_lock) + mutex_exit(parent->p_lock); +} + +/* * make process 'parent' the new parent of process 'child'. * * Must be called with proc_lock held. Index: src/sys/kern/kern_fork.c diff -u src/sys/kern/kern_fork.c:1.195 src/sys/kern/kern_fork.c:1.196 --- src/sys/kern/kern_fork.c:1.195 Sat Jan 9 02:52:38 2016 +++ src/sys/kern/kern_fork.c Fri Nov 4 14:14:04 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_fork.c,v 1.195 2016/01/09 07:52:38 dholland Exp $ */ +/* $NetBSD: kern_fork.c,v 1.196 2016/11/04 18:14:04 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.195 2016/01/09 07:52:38 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_fork.c,v 1.196 2016/11/04 18:14:04 christos Exp $"); #include "opt_ktrace.h" #include "opt_dtrace.h" @@ -477,26 +477,7 @@ fork1(struct lwp *l1, int flags, int exi tracefork = (p1->p_slflag & (PSL_TRACEFORK|PSL_TRACED)) == (PSL_TRACEFORK|PSL_TRACED) && (flags && FORK_PPWAIT) == 0; if (tracefork) { - p2->p_slflag |= PSL_TRACED; - p2->p_opptr = p2->p_pptr; - if (p2->p_pptr != p1->p_pptr) { - struct proc *parent1 = p2->p_pptr; - - if (parent1->p_lock < p2->p_lock) { - if (!mutex_tryenter(parent1->p_lock)) { - mutex_exit(p2->p_lock); - mutex_enter(parent1->p_lock); - mutex_enter(p2->p_lock); - } - } else if (parent1->p_lock > p2->p_lock) { - mutex_enter(parent1->p_lock); - } - parent1->p_slflag |= PSL_CHTRACED; - proc_reparent(p2, p1->p_pptr); - if (parent1->p_lock != p2->p_lock) - mutex_exit(parent1->p_lock); - } - + proc_changeparent(p2, p1->p_pptr); /* * Set ptrace status. */ Index: src/sys/kern/sys_ptrace_common.c diff -u src/sys/kern/sys_ptrace_common.c:1.1 src/sys/kern/sys_ptrace_common.c:1.2 --- src/sys/kern/sys_ptrace_common.c:1.1 Tue Nov 1 20:11:59 2016 +++ src/sys/kern/sys_ptrace_common.c Fri Nov 4 14:14:04 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: sys_ptrace_common.c,v 1.1 2016/11/02 00:11:59 pgoyette Exp $ */ +/* $NetBSD: sys_ptrace_common.c,v 1.2 2016/11/04 18:14:04 christos Exp $ */ /*- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -118,7 +118,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sys_ptrace_common.c,v 1.1 2016/11/02 00:11:59 pgoyette Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sys_ptrace_common.c,v 1.2 2016/11/04 18:14:04 christos Exp $"); #ifdef _KERNEL_OPT #include "opt_ptrace.h" @@ -813,25 +813,7 @@ do_ptrace(struct ptrace_methods *ptm, st * proc gets to see all the action. * Stop the target. */ - t->p_opptr = t->p_pptr; - if (t->p_pptr != p) { - struct proc *parent = t->p_pptr; - - if (parent->p_lock < t->p_lock) { - if (!mutex_tryenter(parent->p_lock)) { - mutex_exit(t->p_lock); - mutex_enter(parent->p_lock); - mutex_enter(t->p_lock); - } - } else if (parent->p_lock > t->p_lock) { - mutex_enter(parent->p_lock); - } - parent->p_slflag |= PSL_CHTRACED; - proc_reparent(t, p); - if (parent->p_lock != t->p_lock) - mutex_exit(parent->p_lock); - } - SET(t->p_slflag, PSL_TRACED); + proc_changeparent(t, p); signo = SIGSTOP; goto sendsig; Index: src/sys/sys/ptrace.h diff -u src/sys/sys/ptrace.h:1.48 src/sys/sys/ptrace.h:1.49 --- src/sys/sys/ptrace.h:1.48 Tue Nov 1 20:12:00 2016 +++ src/sys/sys/ptrace.h Fri Nov 4 14:14:04 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: ptrace.h,v 1.48 2016/11/02 00:12:00 pgoyette Exp $ */ +/* $NetBSD: ptrace.h,v 1.49 2016/11/04 18:14:04 christos Exp $ */ /*- * Copyright (c) 1984, 1993 @@ -161,6 +161,7 @@ int process_domem(struct lwp *, struct l void process_stoptrace(void); void proc_reparent(struct proc *, struct proc *); +void proc_changeparent(struct proc *, struct proc *); int do_ptrace(struct ptrace_methods *, struct lwp *, int, pid_t, void *,