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