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 *,

Reply via email to