summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_fork.c
diff options
context:
space:
mode:
authorjb <jb@FreeBSD.org>2008-05-24 06:22:16 +0000
committerjb <jb@FreeBSD.org>2008-05-24 06:22:16 +0000
commitc4443570b616a998fb115e9ea8e02aaa8291c538 (patch)
tree5d1a1433c24202dd7d4681d388f6df0788664c25 /sys/kern/kern_fork.c
parente0c188cb54d2e72e7d003f16765a9c3dd9495e8e (diff)
downloadFreeBSD-src-c4443570b616a998fb115e9ea8e02aaa8291c538.zip
FreeBSD-src-c4443570b616a998fb115e9ea8e02aaa8291c538.tar.gz
Add DTrace 'proc' provider probes using the Statically Defined Trace
(sdt) mechanism.
Diffstat (limited to 'sys/kern/kern_fork.c')
-rw-r--r--sys/kern/kern_fork.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c
index 7dc42f4..8387532 100644
--- a/sys/kern/kern_fork.c
+++ b/sys/kern/kern_fork.c
@@ -37,6 +37,7 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include "opt_kdtrace.h"
#include "opt_ktrace.h"
#include "opt_mac.h"
@@ -63,6 +64,7 @@ __FBSDID("$FreeBSD$");
#include <sys/ktr.h>
#include <sys/ktrace.h>
#include <sys/unistd.h>
+#include <sys/sdt.h>
#include <sys/sx.h>
#include <sys/signalvar.h>
@@ -75,6 +77,16 @@ __FBSDID("$FreeBSD$");
#include <vm/vm_extern.h>
#include <vm/uma.h>
+#ifdef KDTRACE_HOOKS
+#include <sys/dtrace_bsd.h>
+dtrace_fork_func_t dtrace_fasttrap_fork;
+#endif
+
+SDT_PROVIDER_DECLARE(proc);
+SDT_PROBE_DEFINE(proc, kernel, , create);
+SDT_PROBE_ARGTYPE(proc, kernel, , create, 0, "struct proc *");
+SDT_PROBE_ARGTYPE(proc, kernel, , create, 1, "struct proc *");
+SDT_PROBE_ARGTYPE(proc, kernel, , create, 2, "int");
#ifndef _SYS_SYSPROTO_H_
struct fork_args {
@@ -626,6 +638,15 @@ again:
p2->p_pfsflags = p1->p_pfsflags;
}
+#ifdef KDTRACE_HOOKS
+ /*
+ * Tell the DTrace fasttrap provider about the new process
+ * if it has registered an interest.
+ */
+ if (dtrace_fasttrap_fork)
+ dtrace_fasttrap_fork(p1, p2);
+#endif
+
/*
* This begins the section where we must prevent the parent
* from being swapped.
@@ -715,6 +736,8 @@ again:
PROC_UNLOCK(p1);
+ SDT_PROBE(proc, kernel, , create, p2, p1, flags, 0, 0);
+
/*
* Preserve synchronization semantics of vfork. If waiting for
* child to exec or exit, set P_PPWAIT on child, and sleep on our
OpenPOWER on IntegriCloud