Module Name:    src
Committed By:   christos
Date:           Fri Oct  2 16:54:15 UTC 2015

Modified Files:
        src/sys/kern: kern_exec.c kern_exit.c kern_fork.c kern_lwp.c kern_sdt.c
            kern_sig.c sys_sig.c vfs_cache.c
        src/sys/sys: sdt.h

Log Message:
Change SDT (Statically Defined Tracing) probes to use link sets so that it
is easier to add probes. (From FreeBSD)


To generate a diff of this commit:
cvs rdiff -u -r1.417 -r1.418 src/sys/kern/kern_exec.c
cvs rdiff -u -r1.244 -r1.245 src/sys/kern/kern_exit.c
cvs rdiff -u -r1.193 -r1.194 src/sys/kern/kern_fork.c
cvs rdiff -u -r1.179 -r1.180 src/sys/kern/kern_lwp.c
cvs rdiff -u -r1.1 -r1.2 src/sys/kern/kern_sdt.c
cvs rdiff -u -r1.319 -r1.320 src/sys/kern/kern_sig.c
cvs rdiff -u -r1.44 -r1.45 src/sys/kern/sys_sig.c
cvs rdiff -u -r1.107 -r1.108 src/sys/kern/vfs_cache.c
cvs rdiff -u -r1.5 -r1.6 src/sys/sys/sdt.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_exec.c
diff -u src/sys/kern/kern_exec.c:1.417 src/sys/kern/kern_exec.c:1.418
--- src/sys/kern/kern_exec.c:1.417	Sat Sep 26 12:12:24 2015
+++ src/sys/kern/kern_exec.c	Fri Oct  2 12:54:15 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_exec.c,v 1.417 2015/09/26 16:12:24 maxv Exp $	*/
+/*	$NetBSD: kern_exec.c,v 1.418 2015/10/02 16:54:15 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.417 2015/09/26 16:12:24 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_exec.c,v 1.418 2015/10/02 16:54:15 christos Exp $");
 
 #include "opt_exec.h"
 #include "opt_execfmt.h"
@@ -148,18 +148,10 @@ static void dump_vmcmds(const struct exe
 /*
  * DTrace SDT provider definitions
  */
-SDT_PROBE_DEFINE(proc,,,exec,exec,
-	    "char *", NULL,
-	    NULL, NULL, NULL, NULL,
-	    NULL, NULL, NULL, NULL);
-SDT_PROBE_DEFINE(proc,,,exec_success,exec-success, 
-	    "char *", NULL,
-	    NULL, NULL, NULL, NULL,
-	    NULL, NULL, NULL, NULL);
-SDT_PROBE_DEFINE(proc,,,exec_failure,exec-failure, 
-	    "int", NULL,
-	    NULL, NULL, NULL, NULL,
-	    NULL, NULL, NULL, NULL);
+SDT_PROVIDER_DECLARE(proc);
+SDT_PROBE_DEFINE1(proc, kernel, , exec, "char *");
+SDT_PROBE_DEFINE1(proc, kernel, , exec__success, "char *");
+SDT_PROBE_DEFINE1(proc, kernel, , exec__failure, "int");
 
 /*
  * Exec function switch:
@@ -660,7 +652,7 @@ execve_loadvm(struct lwp *l, const char 
 	p = l->l_proc;
 	modgen = 0;
 
-	SDT_PROBE(proc,,,exec, path, 0, 0, 0, 0);
+	SDT_PROBE(proc, kernel, , exec, path, 0, 0, 0, 0);
 
 	/*
 	 * Check if we have exceeded our number of processes limit.
@@ -822,7 +814,7 @@ execve_loadvm(struct lwp *l, const char 
 		goto retry;
 	}
 
-	SDT_PROBE(proc,,,exec_failure, error, 0, 0, 0, 0);
+	SDT_PROBE(proc, kernel, , exec__failure, error, 0, 0, 0, 0);
 	return error;
 }
 
@@ -1265,7 +1257,7 @@ execve_runproc(struct lwp *l, struct exe
 
 	kmem_free(epp->ep_hdr, epp->ep_hdrlen);
 
-	SDT_PROBE(proc,,,exec_success, epp->ep_kname, 0, 0, 0, 0);
+	SDT_PROBE(proc, kernel, , exec__success, epp->ep_kname, 0, 0, 0, 0);
 
 	emulexec(l, epp);
 
@@ -1316,7 +1308,7 @@ execve_runproc(struct lwp *l, struct exe
 	return EJUSTRETURN;
 
  exec_abort:
-	SDT_PROBE(proc,,,exec_failure, error, 0, 0, 0, 0);
+	SDT_PROBE(proc, kernel, , exec__failure, error, 0, 0, 0, 0);
 	rw_exit(&p->p_reflock);
 	if (!no_local_exec_lock)
 		rw_exit(&exec_lock);

Index: src/sys/kern/kern_exit.c
diff -u src/sys/kern/kern_exit.c:1.244 src/sys/kern/kern_exit.c:1.245
--- src/sys/kern/kern_exit.c:1.244	Mon May  5 11:45:32 2014
+++ src/sys/kern/kern_exit.c	Fri Oct  2 12:54:15 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_exit.c,v 1.244 2014/05/05 15:45:32 christos Exp $	*/
+/*	$NetBSD: kern_exit.c,v 1.245 2015/10/02 16:54:15 christos Exp $	*/
 
 /*-
  * Copyright (c) 1998, 1999, 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -67,9 +67,10 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_exit.c,v 1.244 2014/05/05 15:45:32 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_exit.c,v 1.245 2015/10/02 16:54:15 christos Exp $");
 
 #include "opt_ktrace.h"
+#include "opt_dtrace.h"
 #include "opt_perfctrs.h"
 #include "opt_sysv.h"
 
@@ -123,10 +124,9 @@ static void proc_free(struct proc *, str
 /*
  * DTrace SDT provider definitions
  */
-SDT_PROBE_DEFINE(proc,,,exit,exit,
-	    "int", NULL, 		/* reason */
-	    NULL, NULL, NULL, NULL,
-	    NULL, NULL, NULL, NULL);
+SDT_PROVIDER_DECLARE(proc);
+SDT_PROBE_DEFINE1(proc, kernel, , exit, "int");
+
 /*
  * Fill in the appropriate signal information, and signal the parent.
  */
@@ -414,7 +414,7 @@ exit1(struct lwp *l, int rv)
 	 */
 	KNOTE(&p->p_klist, NOTE_EXIT);
 
-	SDT_PROBE(proc,,,exit,
+	SDT_PROBE(proc, kernel, , exit,
 		(WCOREDUMP(rv) ? CLD_DUMPED :
 		 (WIFSIGNALED(rv) ? CLD_KILLED : CLD_EXITED)),
 		0,0,0,0);

Index: src/sys/kern/kern_fork.c
diff -u src/sys/kern/kern_fork.c:1.193 src/sys/kern/kern_fork.c:1.194
--- src/sys/kern/kern_fork.c:1.193	Fri Nov 22 16:04:11 2013
+++ src/sys/kern/kern_fork.c	Fri Oct  2 12:54:15 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_fork.c,v 1.193 2013/11/22 21:04:11 christos Exp $	*/
+/*	$NetBSD: kern_fork.c,v 1.194 2015/10/02 16:54:15 christos Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2001, 2004, 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -67,9 +67,10 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_fork.c,v 1.193 2013/11/22 21:04:11 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_fork.c,v 1.194 2015/10/02 16:54:15 christos Exp $");
 
 #include "opt_ktrace.h"
+#include "opt_dtrace.h"
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -98,11 +99,11 @@ __KERNEL_RCSID(0, "$NetBSD: kern_fork.c,
 /*
  * DTrace SDT provider definitions
  */
-SDT_PROBE_DEFINE(proc,,,create,create,
-	    "struct proc *", NULL,	/* new process */
-	    "struct proc *", NULL,	/* parent process */
-	    "int", NULL,		/* flags */
-	    NULL, NULL, NULL, NULL);
+SDT_PROVIDER_DECLARE(proc);
+SDT_PROBE_DEFINE3(proc, kernel, , create,
+    "struct proc *", /* new process */
+    "struct proc *", /* parent process */
+    "int" /* flags */);
 
 u_int	nprocs __cacheline_aligned = 1;		/* process 0 */
 
@@ -455,7 +456,7 @@ fork1(struct lwp *l1, int flags, int exi
 	 */
 	doforkhooks(p2, p1);
 
-	SDT_PROBE(proc,,,create, p2, p1, flags, 0, 0);
+	SDT_PROBE(proc, kernel, , create, p2, p1, flags, 0, 0);
 
 	/*
 	 * It's now safe for the scheduler and other processes to see the

Index: src/sys/kern/kern_lwp.c
diff -u src/sys/kern/kern_lwp.c:1.179 src/sys/kern/kern_lwp.c:1.180
--- src/sys/kern/kern_lwp.c:1.179	Sat Oct 18 04:33:29 2014
+++ src/sys/kern/kern_lwp.c	Fri Oct  2 12:54:15 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_lwp.c,v 1.179 2014/10/18 08:33:29 snj Exp $	*/
+/*	$NetBSD: kern_lwp.c,v 1.180 2015/10/02 16:54:15 christos Exp $	*/
 
 /*-
  * Copyright (c) 2001, 2006, 2007, 2008, 2009 The NetBSD Foundation, Inc.
@@ -211,7 +211,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_lwp.c,v 1.179 2014/10/18 08:33:29 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_lwp.c,v 1.180 2015/10/02 16:54:15 christos Exp $");
 
 #include "opt_ddb.h"
 #include "opt_lockdebug.h"
@@ -251,18 +251,11 @@ struct lwplist		alllwp		__cacheline_alig
 static void		lwp_dtor(void *, void *);
 
 /* DTrace proc provider probes */
-SDT_PROBE_DEFINE(proc,,,lwp_create,lwp-create,
-	"struct lwp *", NULL,
-	NULL, NULL, NULL, NULL,
-	NULL, NULL, NULL, NULL);
-SDT_PROBE_DEFINE(proc,,,lwp_start,lwp-start,
-	"struct lwp *", NULL,
-	NULL, NULL, NULL, NULL,
-	NULL, NULL, NULL, NULL);
-SDT_PROBE_DEFINE(proc,,,lwp_exit,lwp-exit,
-	"struct lwp *", NULL,
-	NULL, NULL, NULL, NULL,
-	NULL, NULL, NULL, NULL);
+SDT_PROVIDER_DEFINE(proc);
+
+SDT_PROBE_DEFINE1(proc, kernel, , lwp__create, "struct lwp *");
+SDT_PROBE_DEFINE1(proc, kernel, , lwp__start, "struct lwp *");
+SDT_PROBE_DEFINE1(proc, kernel, , lwp__exit, "struct lwp *");
 
 struct turnstile turnstile0;
 struct lwp lwp0 __aligned(MIN_LWP_ALIGNMENT) = {
@@ -961,7 +954,7 @@ lwp_create(lwp_t *l1, proc_t *p2, vaddr_
 	}
 	mutex_exit(p2->p_lock);
 
-	SDT_PROBE(proc,,,lwp_create, l2, 0,0,0,0);
+	SDT_PROBE(proc, kernel, , lwp__create, l2, 0, 0, 0, 0);
 
 	mutex_enter(proc_lock);
 	LIST_INSERT_HEAD(&alllwp, l2, l_list);
@@ -985,7 +978,7 @@ lwp_startup(struct lwp *prev, struct lwp
 {
 	KASSERTMSG(new_lwp == curlwp, "l %p curlwp %p prevlwp %p", new_lwp, curlwp, prev);
 
-	SDT_PROBE(proc,,,lwp_start, new_lwp, 0,0,0,0);
+	SDT_PROBE(proc, kernel, , lwp__start, new_lwp, 0, 0, 0, 0);
 
 	KASSERT(kpreempt_disabled());
 	if (prev != NULL) {
@@ -1028,7 +1021,7 @@ lwp_exit(struct lwp *l)
 	KASSERT(current || (l->l_stat == LSIDL && l->l_target_cpu == NULL));
 	KASSERT(p == curproc);
 
-	SDT_PROBE(proc,,,lwp_exit, l, 0,0,0,0);
+	SDT_PROBE(proc, kernel, , lwp__exit, l, 0, 0, 0, 0);
 
 	/*
 	 * Verify that we hold no locks other than the kernel lock.

Index: src/sys/kern/kern_sdt.c
diff -u src/sys/kern/kern_sdt.c:1.1 src/sys/kern/kern_sdt.c:1.2
--- src/sys/kern/kern_sdt.c:1.1	Mon Mar  1 16:10:17 2010
+++ src/sys/kern/kern_sdt.c	Fri Oct  2 12:54:15 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_sdt.c,v 1.1 2010/03/01 21:10:17 darran Exp $	*/
+/*	$NetBSD: kern_sdt.c,v 1.2 2015/10/02 16:54:15 christos Exp $	*/
 
 /*-
  * Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -62,6 +62,9 @@
  * not be present. A module may be built with SDT probes in it.
  *
  */
+#ifdef _KERNEL_OPT
+#include "opt_dtrace.h"
+#endif
 
 #include <sys/cdefs.h>
 #include <sys/param.h>
@@ -71,6 +74,10 @@
 void sdt_probe_stub(u_int32_t, uintptr_t, uintptr_t,
 	uintptr_t, uintptr_t, uintptr_t);
 
+__link_set_decl(sdt_providers_set, struct sdt_provider);
+__link_set_decl(sdt_probes_set, struct sdt_probe);
+__link_set_decl(sdt_argtypes_set, struct sdt_argtype);
+
 /*
  * Hook for the DTrace probe function. The 'sdt' provider will set this
  * to dtrace_probe when it loads.
@@ -86,7 +93,20 @@ void
 sdt_probe_stub(u_int32_t id, uintptr_t arg0, uintptr_t arg1,
     uintptr_t arg2, uintptr_t arg3, uintptr_t arg4)
 {
+	struct sdt_provider * const * provider;
+	struct sdt_probe * const * probe;
+	struct sdt_argtype * const * argtype;
 	printf("%s: XXX should not be called\n", __func__);
+	printf("providers: ");
+	__link_set_foreach(provider, sdt_providers_set)
+		printf("%s ", (*provider)->name);
+	printf("\nprobes: ");
+	__link_set_foreach(probe, sdt_probes_set)
+		printf("%s ", (*probe)->name);
+	printf("\nargtypes: ");
+	__link_set_foreach(argtype, sdt_argtypes_set)
+		printf("%s ", (*argtype)->type);
+	printf("\n");
 }
 
 /*

Index: src/sys/kern/kern_sig.c
diff -u src/sys/kern/kern_sig.c:1.319 src/sys/kern/kern_sig.c:1.320
--- src/sys/kern/kern_sig.c:1.319	Fri Nov 22 16:04:11 2013
+++ src/sys/kern/kern_sig.c	Fri Oct  2 12:54:15 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_sig.c,v 1.319 2013/11/22 21:04:11 christos Exp $	*/
+/*	$NetBSD: kern_sig.c,v 1.320 2015/10/02 16:54:15 christos Exp $	*/
 
 /*-
  * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -70,9 +70,10 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_sig.c,v 1.319 2013/11/22 21:04:11 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_sig.c,v 1.320 2015/10/02 16:54:15 christos Exp $");
 
 #include "opt_ptrace.h"
+#include "opt_dtrace.h"
 #include "opt_compat_sunos.h"
 #include "opt_compat_netbsd.h"
 #include "opt_compat_netbsd32.h"
@@ -131,25 +132,19 @@ int (*coredump_vec)(struct lwp *, const 
 /*
  * DTrace SDT provider definitions
  */
-SDT_PROBE_DEFINE(proc,,,signal_send,signal-send,
-	    "struct lwp *", NULL,	/* target thread */
-	    "struct proc *", NULL,	/* target process */
-	    "int", NULL, 		/* signal */
-	    NULL, NULL, NULL, NULL);
-SDT_PROBE_DEFINE(proc,,,signal_discard,signal-discard,
-	    "struct lwp *", NULL,	/* target thread */
-	    "struct proc *", NULL,	/* target process */
-	    "int", NULL, 		/* signal */
-	    NULL, NULL, NULL, NULL);
-SDT_PROBE_DEFINE(proc,,,signal_clear,signal-clear,
-	    "int", NULL,		/* signal */
-	    NULL, NULL, NULL, NULL,
-	    NULL, NULL, NULL, NULL);
-SDT_PROBE_DEFINE(proc,,,signal_handle,signal-handle,
-	    "int", NULL,		/* signal */
-	    "ksiginfo_t *", NULL,
-	    "void (*)(void)", NULL,	/* handler address */
-	    NULL, NULL, NULL, NULL);
+SDT_PROVIDER_DECLARE(proc);
+SDT_PROBE_DEFINE3(proc, kernel, , signal__send,
+    "struct lwp *", 	/* target thread */
+    "struct proc *", 	/* target process */
+    "int");		/* signal */
+SDT_PROBE_DEFINE3(proc, kernel, , signal__discard,
+    "struct lwp *",	/* target thread */
+    "struct proc *",	/* target process */
+    "int");  		/* signal */
+SDT_PROBE_DEFINE3(proc, kernel, , signal__handle,
+    "int", 		/* signal */
+    "ksiginfo_t *", 	/* signal info */
+    "void (*)(void)");	/* handler address */
 
 
 static struct pool_allocator sigactspool_allocator = {
@@ -1032,7 +1027,7 @@ sigpost(struct lwp *l, sig_t action, int
 	if (l->l_refcnt == 0)
 		return 0;
 
-	SDT_PROBE(proc,,,signal_send, l, p, sig,  0, 0);
+	SDT_PROBE(proc, kernel, , signal__send, l, p, sig, 0, 0);
 
 	/*
 	 * Have the LWP check for signals.  This ensures that even if no LWP
@@ -1202,7 +1197,7 @@ kpsignal2(struct proc *p, ksiginfo_t *ks
 {
 	int prop, signo = ksi->ksi_signo;
 	struct sigacts *sa;
-	struct lwp *l;
+	struct lwp *l = NULL;
 	ksiginfo_t *kp;
 	lwpid_t lid;
 	sig_t action;
@@ -1246,7 +1241,7 @@ kpsignal2(struct proc *p, ksiginfo_t *ks
 			 * is being caught, make sure to save any ksiginfo.
 			 */
 			if ((kp = ksiginfo_alloc(p, ksi, PR_NOWAIT)) == NULL)
-				return;
+				goto discard;
 			sigput(&p->p_sigpend, p, kp);
 		}
 	} else {
@@ -1271,7 +1266,7 @@ kpsignal2(struct proc *p, ksiginfo_t *ks
 		 * SIG_IGN, action will be SIG_DFL here.
 		 */
 		if (sigismember(&p->p_sigctx.ps_sigignore, signo))
-			return;
+			goto discard;
 
 		else if (sigismember(&p->p_sigctx.ps_sigcatch, signo))
 			action = SIG_CATCH;
@@ -1285,7 +1280,7 @@ kpsignal2(struct proc *p, ksiginfo_t *ks
 			 * if sleeping, and don't clear any pending SIGCONT.
 			 */
 			if (prop & SA_TTYSTOP && p->p_pgrp->pg_jobc == 0)
-				return;
+				goto discard;
 
 			if (prop & SA_KILL && p->p_nice > NZERO)
 				p->p_nice = NZERO;
@@ -1315,14 +1310,14 @@ kpsignal2(struct proc *p, ksiginfo_t *ks
 	if ((prop & SA_CANTMASK) == 0 && !LIST_EMPTY(&p->p_sigwaiters) &&
 	    p->p_stat == SACTIVE && (p->p_sflag & PS_STOPPING) == 0 &&
 	    sigunwait(p, ksi))
-		return;
+		goto discard;
 
 	/*
 	 * XXXSMP Should be allocated by the caller, we're holding locks
 	 * here.
 	 */
 	if (kp == NULL && (kp = ksiginfo_alloc(p, ksi, PR_NOWAIT)) == NULL)
-		return;
+		goto discard;
 
 	/*
 	 * LWP private signals are easy - just find the LWP and post
@@ -1416,12 +1411,17 @@ deliver:
 		if (sigpost(l, action, prop, kp->ksi_signo) && !toall)
 			break;
 	}
+	signo = -1;
 out:
 	/*
 	 * If the ksiginfo wasn't used, then bin it.  XXXSMP freeing memory
 	 * with locks held.  The caller should take care of this.
 	 */
 	ksiginfo_free(kp);
+	if (signo == -1)
+		return;
+discard:
+	SDT_PROBE(proc, kernel, , signal__discard, l, p, signo, 0, 0);
 }
 
 void
@@ -1704,10 +1704,6 @@ issignal(struct lwp *l)
 
 		prop = sigprop[signo];
 
-		/* XXX no siginfo? */
-		SDT_PROBE(proc,,,signal_handle, signo, 0, 
-			SIGACTION(p, signo).sa_handler, 0, 0);
-
 		/*
 		 * Decide whether the signal should be returned.
 		 */
@@ -1840,6 +1836,8 @@ postsig(int signo)
 		mutex_enter(p->p_lock);
 	}
 
+	SDT_PROBE(proc, kernel, , signal__handle, signo, &ksi, action, 0, 0);
+
 	if (action == SIG_DFL) {
 		/*
 		 * Default action, where the default is to kill

Index: src/sys/kern/sys_sig.c
diff -u src/sys/kern/sys_sig.c:1.44 src/sys/kern/sys_sig.c:1.45
--- src/sys/kern/sys_sig.c:1.44	Fri Jun 19 06:18:19 2015
+++ src/sys/kern/sys_sig.c	Fri Oct  2 12:54:15 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: sys_sig.c,v 1.44 2015/06/19 10:18:19 martin Exp $	*/
+/*	$NetBSD: sys_sig.c,v 1.45 2015/10/02 16:54:15 christos Exp $	*/
 
 /*-
  * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -66,7 +66,9 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sys_sig.c,v 1.44 2015/06/19 10:18:19 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sys_sig.c,v 1.45 2015/10/02 16:54:15 christos Exp $");
+
+#include "opt_dtrace.h"
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -78,6 +80,12 @@ __KERNEL_RCSID(0, "$NetBSD: sys_sig.c,v 
 #include <sys/wait.h>
 #include <sys/kmem.h>
 #include <sys/module.h>
+#include <sys/sdt.h>
+
+SDT_PROVIDER_DECLARE(proc);
+SDT_PROBE_DEFINE2(proc, kernel, , signal__clear,
+    "int", 		/* signal */
+    "ksiginfo_t *");	/* signal-info */
 
 int
 sys___sigaction_sigtramp(struct lwp *l,
@@ -833,7 +841,10 @@ out:
 		error = (*storeinf)(&ksi.ksi_info, SCARG(uap, info),
 		    sizeof(ksi.ksi_info));
 	}
-	if (error == 0)
+	if (error == 0) {
 		*retval = ksi.ksi_info._signo;
+		SDT_PROBE(proc, kernel, , signal__clear, *retval,
+		    &ksi, 0, 0, 0);
+	}
 	return error;
 }

Index: src/sys/kern/vfs_cache.c
diff -u src/sys/kern/vfs_cache.c:1.107 src/sys/kern/vfs_cache.c:1.108
--- src/sys/kern/vfs_cache.c:1.107	Mon Aug 24 18:50:32 2015
+++ src/sys/kern/vfs_cache.c	Fri Oct  2 12:54:15 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: vfs_cache.c,v 1.107 2015/08/24 22:50:32 pooka Exp $	*/
+/*	$NetBSD: vfs_cache.c,v 1.108 2015/10/02 16:54:15 christos Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -58,11 +58,12 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_cache.c,v 1.107 2015/08/24 22:50:32 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_cache.c,v 1.108 2015/10/02 16:54:15 christos Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_ddb.h"
 #include "opt_revcache.h"
+#include "opt_dtrace.h"
 #endif
 
 #include <sys/param.h>
@@ -80,6 +81,7 @@ __KERNEL_RCSID(0, "$NetBSD: vfs_cache.c,
 #include <sys/kernel.h>
 #include <sys/cpu.h>
 #include <sys/evcnt.h>
+#include <sys/sdt.h>
 
 #define NAMECACHE_ENTER_REVERSE
 /*
@@ -263,6 +265,29 @@ static void cache_dtor(void *, void *);
 static struct sysctllog *sysctllog;
 static void sysctl_cache_stat_setup(void);
 
+SDT_PROVIDER_DEFINE(vfs);
+
+SDT_PROBE_DEFINE1(vfs, namecache, invalidate, done, "struct vnode *");
+SDT_PROBE_DEFINE1(vfs, namecache, purge, parents, "struct vnode *");
+SDT_PROBE_DEFINE1(vfs, namecache, purge, children, "struct vnode *");
+SDT_PROBE_DEFINE2(vfs, namecache, purge, name, "char *", "size_t");
+SDT_PROBE_DEFINE1(vfs, namecache, purge, vfs, "struct mount *");
+SDT_PROBE_DEFINE3(vfs, namecache, lookup, hit, "struct vnode *",
+    "char *", "size_t");
+SDT_PROBE_DEFINE3(vfs, namecache, lookup, miss, "struct vnode *",
+    "char *", "size_t");
+SDT_PROBE_DEFINE3(vfs, namecache, lookup, toolong, "struct vnode *",
+    "char *", "size_t");
+SDT_PROBE_DEFINE2(vfs, namecache, revlookup, success, "struct vnode *",
+     "struct vnode *");
+SDT_PROBE_DEFINE2(vfs, namecache, revlookup, fail, "struct vnode *",
+     "int");
+SDT_PROBE_DEFINE2(vfs, namecache, prune, done, "int", "int");
+SDT_PROBE_DEFINE3(vfs, namecache, enter, toolong, "struct vnode *",
+    "char *", "size_t");
+SDT_PROBE_DEFINE3(vfs, namecache, enter, done, "struct vnode *",
+    "char *", "size_t");
+
 /*
  * Compute the hash for an entry.
  *
@@ -291,6 +316,9 @@ cache_invalidate(struct namecache *ncp)
 	KASSERT(mutex_owned(&ncp->nc_lock));
 
 	if (ncp->nc_dvp != NULL) {
+		SDT_PROBE(vfs, namecache, invalidate, done, ncp->nc_dvp,
+		    0, 0, 0, 0);
+
 		ncp->nc_vp = NULL;
 		ncp->nc_dvp = NULL;
 		do {
@@ -407,12 +435,16 @@ cache_lookup_entry(const struct vnode *d
 	    	mutex_enter(&ncp->nc_lock);
 		if (__predict_true(ncp->nc_dvp == dvp)) {
 			ncp->nc_hittime = hardclock_ticks;
+			SDT_PROBE(vfs, namecache, lookup, hit, dvp,
+			    name, namelen, 0, 0);
 			return ncp;
 		}
 		/* Raced: entry has been nullified. */
 		mutex_exit(&ncp->nc_lock);
 	}
 
+	SDT_PROBE(vfs, namecache, lookup, miss, dvp,
+	    name, namelen, 0, 0);
 	return NULL;
 }
 
@@ -490,6 +522,8 @@ cache_lookup(struct vnode *dvp, const ch
 	cpup = curcpu()->ci_data.cpu_nch;
 	mutex_enter(&cpup->cpu_lock);
 	if (__predict_false(namelen > NCHNAMLEN)) {
+		SDT_PROBE(vfs, namecache, lookup, toolong, dvp,
+		    name, namelen, 0, 0);
 		COUNT(cpup, ncs_long);
 		mutex_exit(&cpup->cpu_lock);
 		/* found nothing */
@@ -717,6 +751,8 @@ cache_revlookup(struct vnode *vp, struct
 					*dvpp = NULL;
 					mutex_exit(&ncp->nc_lock);
 					mutex_exit(namecache_lock);
+					SDT_PROBE(vfs, namecache, revlookup,
+					    fail, vp, ERANGE, 0, 0, 0);
 					return (ERANGE);
 				}
 				memcpy(bp, ncp->nc_name, nlen);
@@ -732,9 +768,13 @@ cache_revlookup(struct vnode *vp, struct
 				if (bufp)
 					(*bpp) += nlen;
 				*dvpp = NULL;
+				SDT_PROBE(vfs, namecache, revlookup, fail, vp,
+				    error, 0, 0, 0);
 				return -1;
 			}
 			*dvpp = dvp;
+			SDT_PROBE(vfs, namecache, revlookup, success, vp, dvp,
+			    0, 0, 0);
 			return (0);
 		}
 		mutex_exit(&ncp->nc_lock);
@@ -762,9 +802,12 @@ cache_enter(struct vnode *dvp, struct vn
 	/* First, check whether we can/should add a cache entry. */
 	if ((cnflags & MAKEENTRY) == 0 ||
 	    __predict_false(namelen > NCHNAMLEN || !doingcache)) {
+		SDT_PROBE(vfs, namecache, enter, toolong, vp, name, namelen,
+		    0, 0);
 		return;
 	}
 
+	SDT_PROBE(vfs, namecache, enter, done, vp, name, namelen, 0, 0);
 	if (numcache > desiredvnodes) {
 		mutex_enter(namecache_lock);
 		cache_ev_forced.ev_count++;
@@ -987,6 +1030,8 @@ cache_purge1(struct vnode *vp, const cha
 
 	mutex_enter(namecache_lock);
 	if (flags & PURGE_PARENTS) {
+		SDT_PROBE(vfs, namecache, purge, parents, vp, 0, 0, 0, 0);
+
 		for (ncp = LIST_FIRST(&vp->v_nclist); ncp != NULL;
 		    ncp = ncnext) {
 			ncnext = LIST_NEXT(ncp, nc_vlist);
@@ -997,6 +1042,7 @@ cache_purge1(struct vnode *vp, const cha
 		}
 	}
 	if (flags & PURGE_CHILDREN) {
+		SDT_PROBE(vfs, namecache, purge, children, vp, 0, 0, 0, 0);
 		for (ncp = LIST_FIRST(&vp->v_dnclist); ncp != NULL;
 		    ncp = ncnext) {
 			ncnext = LIST_NEXT(ncp, nc_dvlist);
@@ -1007,6 +1053,7 @@ cache_purge1(struct vnode *vp, const cha
 		}
 	}
 	if (name != NULL) {
+		SDT_PROBE(vfs, namecache, purge, name, name, namelen, 0, 0, 0);
 		ncp = cache_lookup_entry(vp, name, namelen);
 		if (ncp) {
 			cache_invalidate(ncp);
@@ -1026,6 +1073,7 @@ cache_purgevfs(struct mount *mp)
 {
 	struct namecache *ncp, *nxtcp;
 
+	SDT_PROBE(vfs, namecache, purge, vfs, mp, 0, 0, 0, 0);
 	mutex_enter(namecache_lock);
 	for (ncp = TAILQ_FIRST(&nclruhead); ncp != NULL; ncp = nxtcp) {
 		nxtcp = TAILQ_NEXT(ncp, nc_lru);
@@ -1055,6 +1103,7 @@ cache_prune(int incache, int target)
 
 	KASSERT(mutex_owned(namecache_lock));
 
+	SDT_PROBE(vfs, namecache, prune, done, incache, target, 0, 0, 0);
 	items = 0;
 	tryharder = 0;
 	recent = hardclock_ticks - hz * cache_hottime;

Index: src/sys/sys/sdt.h
diff -u src/sys/sys/sdt.h:1.5 src/sys/sys/sdt.h:1.6
--- src/sys/sys/sdt.h:1.5	Sat Oct 18 04:33:29 2014
+++ src/sys/sys/sdt.h	Fri Oct  2 12:54:15 2015
@@ -1,12 +1,5 @@
-/*	$NetBSD: sdt.h,v 1.5 2014/10/18 08:33:29 snj Exp $	*/
-
 /*-
- * Copyright (c) 2010 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * This code is derived from software contributed to The NetBSD Foundation
- * by CoyotePoint Systems, Inc. It was developed under contract to 
- * CoyotePoint by Darran Hunt.
+ * Copyright 2006-2008 John Birrell <j...@freebsd.org>
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -16,47 +9,359 @@
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD: head/sys/sys/sdt.h 270990 2014-09-02 23:43:06Z markj $
  *
+ * Statically Defined Tracing (SDT) definitions.
  *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef _SDT_H_
-#define _SDT_H_
+#ifndef _SYS_SDT_H
+#define	_SYS_SDT_H
+
+#ifndef _KERNEL
+
+#define	_DTRACE_VERSION	1
 
-/* should be stdint.h, but this works transparently for both user and kernel */
-#include <sys/stdint.h>
+#define	DTRACE_PROBE(prov, name) {				\
+	extern void __dtrace_##prov##___##name(void);		\
+	__dtrace_##prov##___##name();				\
+}
+
+#define	DTRACE_PROBE1(prov, name, arg1) {			\
+	extern void __dtrace_##prov##___##name(unsigned long);	\
+	__dtrace_##prov##___##name((unsigned long)arg1);	\
+}
+
+#define	DTRACE_PROBE2(prov, name, arg1, arg2) {			\
+	extern void __dtrace_##prov##___##name(unsigned long,	\
+	    unsigned long);					\
+	__dtrace_##prov##___##name((unsigned long)arg1,		\
+	    (unsigned long)arg2);				\
+}
+
+#define	DTRACE_PROBE3(prov, name, arg1, arg2, arg3) {		\
+	extern void __dtrace_##prov##___##name(unsigned long,	\
+	    unsigned long, unsigned long);			\
+	__dtrace_##prov##___##name((unsigned long)arg1,		\
+	    (unsigned long)arg2, (unsigned long)arg3);		\
+}
+
+#define	DTRACE_PROBE4(prov, name, arg1, arg2, arg3, arg4) {	\
+	extern void __dtrace_##prov##___##name(unsigned long,	\
+	    unsigned long, unsigned long, unsigned long);	\
+	__dtrace_##prov##___##name((unsigned long)arg1,		\
+	    (unsigned long)arg2, (unsigned long)arg3,		\
+	    (unsigned long)arg4);				\
+}
+
+#define	DTRACE_PROBE5(prov, name, arg1, arg2, arg3, arg4, arg5) {	\
+	extern void __dtrace_##prov##___##name(unsigned long,		\
+	    unsigned long, unsigned long, unsigned long, unsigned long);\
+	__dtrace_##prov##___##name((unsigned long)arg1,			\
+	    (unsigned long)arg2, (unsigned long)arg3,			\
+	    (unsigned long)arg4, (unsigned long)arg5);			\
+}
+
+#else /* _KERNEL */
+
+#include <sys/cdefs.h>
+
+#ifndef KDTRACE_HOOKS
+
+#define SDT_PROVIDER_DEFINE(prov)
+#define SDT_PROVIDER_DECLARE(prov)
+#define SDT_PROBE_DEFINE(prov, mod, func, name)
+#define SDT_PROBE_DECLARE(prov, mod, func, name)
+#define SDT_PROBE(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4)
+#define SDT_PROBE_ARGTYPE(prov, mod, func, name, num, type, xtype)
+
+#define	SDT_PROBE_DEFINE0(prov, mod, func, name)
+#define	SDT_PROBE_DEFINE1(prov, mod, func, name, arg0)
+#define	SDT_PROBE_DEFINE2(prov, mod, func, name, arg0, arg1)
+#define	SDT_PROBE_DEFINE3(prov, mod, func, name, arg0, arg1, arg2)
+#define	SDT_PROBE_DEFINE4(prov, mod, func, name, arg0, arg1, arg2, arg3)
+#define	SDT_PROBE_DEFINE5(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4)
+#define	SDT_PROBE_DEFINE6(prov, mod, func, name, arg0, arg1, arg2,      \
+    arg3, arg4, arg5)
+#define	SDT_PROBE_DEFINE7(prov, mod, func, name, arg0, arg1, arg2,      \
+    arg3, arg4, arg5, arg6)
+
+#define	SDT_PROBE0(prov, mod, func, name)
+#define	SDT_PROBE1(prov, mod, func, name, arg0)
+#define	SDT_PROBE2(prov, mod, func, name, arg0, arg1)
+#define	SDT_PROBE3(prov, mod, func, name, arg0, arg1, arg2)
+#define	SDT_PROBE4(prov, mod, func, name, arg0, arg1, arg2, arg3)
+#define	SDT_PROBE5(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4)
+#define	SDT_PROBE6(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4, arg5)
+#define	SDT_PROBE7(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4, arg5,  \
+    arg6)
+
+#define	SDT_PROBE_DEFINE0_XLATE(prov, mod, func, name)
+#define	SDT_PROBE_DEFINE1_XLATE(prov, mod, func, name, arg0, xarg0)
+#define	SDT_PROBE_DEFINE2_XLATE(prov, mod, func, name, arg0, xarg0,     \
+    arg1, xarg1)
+#define	SDT_PROBE_DEFINE3_XLATE(prov, mod, func, name, arg0, xarg0,     \
+    arg1, xarg1, arg2, xarg2)
+#define SDT_PROBE_DEFINE4_XLATE(prov, mod, func, name, arg0, xarg0,     \
+    arg1, xarg1, arg2, xarg2, arg3, xarg3)
+#define	SDT_PROBE_DEFINE5_XLATE(prov, mod, func, name, arg0, xarg0,     \
+    arg1, xarg1, arg2, xarg2, arg3, xarg3, arg4, xarg4)
+#define	SDT_PROBE_DEFINE6_XLATE(prov, mod, func, name, arg0, xarg0,     \
+    arg1,  xarg1, arg2, xarg2, arg3, xarg3, arg4, xarg4, arg5, xarg5)
+#define	SDT_PROBE_DEFINE7_XLATE(prov, mod, func, name, arg0, xarg0,     \
+    arg1, xarg1, arg2, xarg2, arg3, xarg3, arg4, xarg4, arg5, xarg5, arg6,     \
+    xarg6)
+
+#define	DTRACE_PROBE(name)
+#define	DTRACE_PROBE1(name, type0, arg0)
+#define	DTRACE_PROBE2(name, type0, arg0, type1, arg1)
+#define	DTRACE_PROBE3(name, type0, arg0, type1, arg1, type2, arg2)
+#define	DTRACE_PROBE4(name, type0, arg0, type1, arg1, type2, arg2, type3, arg3)
+#define	DTRACE_PROBE5(name, type0, arg0, type1, arg1, type2, arg2, type3, arg3,\
+    type4, arg4)
+
+#else
 
-#if defined(_KERNEL_OPT)
-#include "opt_dtrace.h"
-#endif
-
-#define SDT_MAX_PROVIDER	1024	/* max number of SDT providers */
-#define SDT_MAX_ARGS		5	/* max number of probe arguments */
-#define SDT_MAX_NAME_SIZE	64	/* max size of provider name */
-
-typedef struct {
-    int		created;	/* boolean: probe created? */
-    int		enabled;	/* boolean: probe enabled? */
-    int		id;		/* dtrace provided probe id */
-    const char	*provider;	/* provider name */
-    const char	*module;	/* module name */
-    const char	*function;	/* function name */
-    const char	*name;		/* probe name */
-    const char	*argv[SDT_MAX_ARGS];	/* probe argument types */
-    const char	*argx[SDT_MAX_ARGS];	/* probe argument xlate types */
-} sdt_probe_t;
+#define SDT_PROVIDER_DEFINE(prov)						\
+	struct sdt_provider sdt_provider_##prov[1] = {				\
+		{ #prov, { NULL, NULL }, 0, 0 }					\
+	};									\
+	__link_set_add_data(sdt_providers_set, sdt_provider_##prov);
+
+#define SDT_PROVIDER_DECLARE(prov)						\
+	extern struct sdt_provider sdt_provider_##prov[1]
+
+#define SDT_PROBE_DEFINE(prov, mod, func, name)					\
+	struct sdt_probe sdt_##prov##_##mod##_##func##_##name[1] = {		\
+		{ sizeof(struct sdt_probe), sdt_provider_##prov,		\
+		    { NULL, NULL }, { NULL, NULL }, #mod, #func, #name, 0, 0,	\
+		    NULL }							\
+	};									\
+	__link_set_add_data(sdt_probes_set, sdt_##prov##_##mod##_##func##_##name);
+
+#define SDT_PROBE_DECLARE(prov, mod, func, name)				\
+	extern struct sdt_probe sdt_##prov##_##mod##_##func##_##name[1]
+
+#define SDT_PROBE(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4)	do {	\
+	if (sdt_##prov##_##mod##_##func##_##name->id)				\
+		(*sdt_probe_func)(sdt_##prov##_##mod##_##func##_##name->id,	\
+		    (uintptr_t) arg0, (uintptr_t) arg1, (uintptr_t) arg2,	\
+		    (uintptr_t) arg3, (uintptr_t) arg4);			\
+} while (0)
+
+#define SDT_PROBE_ARGTYPE(prov, mod, func, name, num, type, xtype)		\
+	static struct sdt_argtype sdta_##prov##_##mod##_##func##_##name##num[1]	\
+	    = { { num, type, xtype, { NULL, NULL },				\
+	    sdt_##prov##_##mod##_##func##_##name }				\
+	};									\
+	__link_set_add_data(sdt_argtypes_set, sdta_##prov##_##mod##_##func##_##name##num);
+
+#define	SDT_PROBE_DEFINE0(prov, mod, func, name)			\
+	SDT_PROBE_DEFINE(prov, mod, func, name)
+
+#define	SDT_PROBE_DEFINE1(prov, mod, func, name, arg0)			\
+	SDT_PROBE_DEFINE(prov, mod, func, name);			\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, NULL)
+
+#define	SDT_PROBE_DEFINE2(prov, mod, func, name, arg0, arg1)		\
+	SDT_PROBE_DEFINE(prov, mod, func, name);			\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, NULL);	\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, NULL)
+
+#define	SDT_PROBE_DEFINE3(prov, mod, func, name, arg0, arg1, arg2)\
+	SDT_PROBE_DEFINE(prov, mod, func, name);			\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, NULL);	\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, NULL);	\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, NULL)
+
+#define	SDT_PROBE_DEFINE4(prov, mod, func, name, arg0, arg1, arg2, arg3) \
+	SDT_PROBE_DEFINE(prov, mod, func, name);			\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, NULL);	\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, NULL);	\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, NULL);	\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3, NULL)
+
+#define	SDT_PROBE_DEFINE5(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4) \
+	SDT_PROBE_DEFINE(prov, mod, func, name);			\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, NULL);	\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, NULL);	\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, NULL);	\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3, NULL);	\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 4, arg4, NULL)
+
+#define	SDT_PROBE_DEFINE6(prov, mod, func, name, arg0, arg1, arg2, arg3,\
+    arg4, arg5) \
+	SDT_PROBE_DEFINE(prov, mod, func, name);			\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, NULL);	\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, NULL);	\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, NULL);	\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3, NULL);	\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 4, arg4, NULL);	\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 5, arg5, NULL)
+
+#define	SDT_PROBE_DEFINE7(prov, mod, func, name, arg0, arg1, arg2, arg3,\
+    arg4, arg5, arg6) \
+	SDT_PROBE_DEFINE(prov, mod, func, name);			\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, NULL);	\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, NULL);	\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, NULL);	\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3, NULL);	\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 4, arg4, NULL);	\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 5, arg5, NULL);	\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 6, arg6, NULL)
+
+#define	SDT_PROBE_DEFINE0_XLATE(prov, mod, func, name)		\
+	SDT_PROBE_DEFINE(prov, mod, func, name)
+
+#define	SDT_PROBE_DEFINE1_XLATE(prov, mod, func, name, arg0, xarg0) \
+	SDT_PROBE_DEFINE(prov, mod, func, name);			\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, xarg0)
+
+#define	SDT_PROBE_DEFINE2_XLATE(prov, mod, func, name, arg0, xarg0, \
+    arg1,  xarg1)							\
+	SDT_PROBE_DEFINE(prov, mod, func, name);			\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, xarg0);	\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, xarg1)
+
+#define	SDT_PROBE_DEFINE3_XLATE(prov, mod, func, name, arg0, xarg0, \
+    arg1, xarg1, arg2, xarg2)						\
+	SDT_PROBE_DEFINE(prov, mod, func, name);			\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, xarg0);	\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, xarg1);	\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, xarg2)
+
+#define	SDT_PROBE_DEFINE4_XLATE(prov, mod, func, name, arg0, xarg0, \
+    arg1, xarg1, arg2, xarg2, arg3, xarg3)				\
+	SDT_PROBE_DEFINE(prov, mod, func, name);			\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, xarg0);	\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, xarg1);	\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, xarg2);	\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3, xarg3)
+
+#define	SDT_PROBE_DEFINE5_XLATE(prov, mod, func, name, arg0, xarg0, \
+    arg1, xarg1, arg2, xarg2, arg3, xarg3, arg4, xarg4)			\
+	SDT_PROBE_DEFINE(prov, mod, func, name);			\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, xarg0);	\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, xarg1);	\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, xarg2);	\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3, xarg3);	\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 4, arg4, xarg4)
+
+#define	SDT_PROBE_DEFINE6_XLATE(prov, mod, func, name, arg0, xarg0, \
+    arg1, xarg1, arg2, xarg2, arg3, xarg3, arg4, xarg4, arg5, xarg5)	\
+	SDT_PROBE_DEFINE(prov, mod, func, name);			\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, xarg0);	\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, xarg1);	\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, xarg2);	\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3, xarg3);	\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 4, arg4, xarg4);	\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 5, arg5, xarg5)
+
+#define	SDT_PROBE_DEFINE7_XLATE(prov, mod, func, name, arg0, xarg0, \
+    arg1, xarg1, arg2, xarg2, arg3, xarg3, arg4, xarg4, arg5, xarg5, arg6, \
+    xarg6)								\
+	SDT_PROBE_DEFINE(prov, mod, func, name);			\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, xarg0);	\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, xarg1);	\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, xarg2);	\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3, xarg3);	\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 4, arg4, xarg4);	\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 5, arg5, xarg5);	\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 6, arg6, xarg6)
+
+#define	SDT_PROBE0(prov, mod, func, name)				\
+	SDT_PROBE(prov, mod, func, name, 0, 0, 0, 0, 0)
+#define	SDT_PROBE1(prov, mod, func, name, arg0)				\
+	SDT_PROBE(prov, mod, func, name, arg0, 0, 0, 0, 0)
+#define	SDT_PROBE2(prov, mod, func, name, arg0, arg1)			\
+	SDT_PROBE(prov, mod, func, name, arg0, arg1, 0, 0, 0)
+#define	SDT_PROBE3(prov, mod, func, name, arg0, arg1, arg2)		\
+	SDT_PROBE(prov, mod, func, name, arg0, arg1, arg2,  0, 0)
+#define	SDT_PROBE4(prov, mod, func, name, arg0, arg1, arg2, arg3)	\
+	SDT_PROBE(prov, mod, func, name, arg0, arg1, arg2, arg3, 0)
+#define	SDT_PROBE5(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4) \
+	SDT_PROBE(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4)
+#define	SDT_PROBE6(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4, arg5)  \
+	do {								       \
+		if (sdt_##prov##_##mod##_##func##_##name->id)		       \
+			(*(void (*)(uint32_t, uintptr_t, uintptr_t, uintptr_t, \
+			    uintptr_t, uintptr_t, uintptr_t))sdt_probe_func)(  \
+			    sdt_##prov##_##mod##_##func##_##name->id,	       \
+			    (uintptr_t)arg0, (uintptr_t)arg1, (uintptr_t)arg2, \
+			    (uintptr_t)arg3, (uintptr_t)arg4, (uintptr_t)arg5);\
+	} while (0)
+#define	SDT_PROBE7(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4, arg5,  \
+    arg6)								       \
+	do {								       \
+		if (sdt_##prov##_##mod##_##func##_##name->id)		       \
+			(*(void (*)(uint32_t, uintptr_t, uintptr_t, uintptr_t, \
+			    uintptr_t, uintptr_t, uintptr_t, uintptr_t))       \
+			    sdt_probe_func)(				       \
+			    sdt_##prov##_##mod##_##func##_##name->id,	       \
+			    (uintptr_t)arg0, (uintptr_t)arg1, (uintptr_t)arg2, \
+			    (uintptr_t)arg3, (uintptr_t)arg4, (uintptr_t)arg5, \
+			    (uintptr_t)arg6);				       \
+	} while (0)
+
+#define	DTRACE_PROBE_IMPL_START(name, arg0, arg1, arg2, arg3, arg4)	do { \
+	static SDT_PROBE_DEFINE(sdt, , , name);				     \
+	SDT_PROBE(sdt, , , name, arg0, arg1, arg2, arg3, arg4);
+#define DTRACE_PROBE_IMPL_END	} while (0)
+
+#define DTRACE_PROBE(name)						\
+	DTRACE_PROBE_IMPL_START(name, 0, 0, 0, 0, 0)			\
+	DTRACE_PROBE_IMPL_END
+
+#define DTRACE_PROBE1(name, type0, arg0)				\
+	DTRACE_PROBE_IMPL_START(name, arg0, 0, 0, 0, 0) 		\
+	SDT_PROBE_ARGTYPE(sdt, , , name, 0, #type0, NULL);		\
+	DTRACE_PROBE_IMPL_END
+
+#define DTRACE_PROBE2(name, type0, arg0, type1, arg1)			\
+	DTRACE_PROBE_IMPL_START(name, arg0, arg1, 0, 0, 0) 		\
+	SDT_PROBE_ARGTYPE(sdt, , , name, 0, #type0, NULL);		\
+	SDT_PROBE_ARGTYPE(sdt, , , name, 1, #type1, NULL);		\
+	DTRACE_PROBE_IMPL_END
+
+#define DTRACE_PROBE3(name, type0, arg0, type1, arg1, type2, arg2)	\
+	DTRACE_PROBE_IMPL_START(name, arg0, arg1, arg2, 0, 0)	 	\
+	SDT_PROBE_ARGTYPE(sdt, , , name, 0, #type0, NULL);		\
+	SDT_PROBE_ARGTYPE(sdt, , , name, 1, #type1, NULL);		\
+	SDT_PROBE_ARGTYPE(sdt, , , name, 2, #type2, NULL);		\
+	DTRACE_PROBE_IMPL_END
+
+#define DTRACE_PROBE4(name, type0, arg0, type1, arg1, type2, arg2, type3, arg3)	\
+	DTRACE_PROBE_IMPL_START(name, arg0, arg1, arg2, arg3, 0) 	\
+	SDT_PROBE_ARGTYPE(sdt, , , name, 0, #type0, NULL);		\
+	SDT_PROBE_ARGTYPE(sdt, , , name, 1, #type1, NULL);		\
+	SDT_PROBE_ARGTYPE(sdt, , , name, 2, #type2, NULL);		\
+	SDT_PROBE_ARGTYPE(sdt, , , name, 3, #type3, NULL);		\
+	DTRACE_PROBE_IMPL_END
+
+#define DTRACE_PROBE5(name, type0, arg0, type1, arg1, type2, arg2, type3, arg3,	\
+    type4, arg4)								\
+	DTRACE_PROBE_IMPL_START(name, arg0, arg1, arg2, arg3, arg4) 	\
+	SDT_PROBE_ARGTYPE(sdt, , , name, 0, #type0, NULL);		\
+	SDT_PROBE_ARGTYPE(sdt, , , name, 1, #type1, NULL);		\
+	SDT_PROBE_ARGTYPE(sdt, , , name, 2, #type2, NULL);		\
+	SDT_PROBE_ARGTYPE(sdt, , , name, 3, #type3, NULL);		\
+	SDT_PROBE_ARGTYPE(sdt, , , name, 4, #type4, NULL);		\
+	DTRACE_PROBE_IMPL_END
 
+#endif /* KDTRACE_HOOKS */
 
 /*
  * This type definition must match that of dtrace_probe. It is defined this
@@ -66,67 +371,54 @@ typedef	void (*sdt_probe_func_t)(uint32_
     uintptr_t arg2, uintptr_t arg3, uintptr_t arg4);
 
 /*
- * The hook for the probe function. See kern_sdt.c which defaults this to
- * its own stub. The 'sdt' provider will set it to dtrace_probe when it
- * loads.
+ * The 'sdt' provider will set it to dtrace_probe when it loads.
  */
 extern sdt_probe_func_t	sdt_probe_func;
 
+struct sdt_probe;
+struct sdt_provider;
+struct linker_file;
+
+struct sdt_argtype {
+	int		ndx;		/* Argument index. */
+	const char	*type;		/* Argument type string. */
+	const char	*xtype;		/* Translated argument type. */
+	TAILQ_ENTRY(sdt_argtype)
+			argtype_entry;	/* Argument type list entry. */
+	struct sdt_probe *probe;	/* Ptr to the probe structure. */
+};
+
+struct sdt_probe {
+	int		version;	/* Set to sizeof(struct sdt_probe). */
+	struct sdt_provider *prov;	/* Ptr to the provider structure. */
+	TAILQ_ENTRY(sdt_probe)
+			probe_entry;	/* SDT probe list entry. */
+	TAILQ_HEAD(argtype_list_head, sdt_argtype) argtype_list;
+	const char	*mod;
+	const char	*func;
+	const char	*name;
+	id_t		id;		/* DTrace probe ID. */
+	int		n_args;		/* Number of arguments. */
+	struct linker_file *sdtp_lf;	/* Module in which we're defined. */
+};
+
+struct sdt_provider {
+	const char *name;		/* Provider name. */
+	TAILQ_ENTRY(sdt_provider)
+			prov_entry;	/* SDT provider list entry. */
+	uintptr_t	id;		/* DTrace provider ID. */
+	int		sdt_refs;	/* Number of module references. */
+};
 
-#define SDT_NAME(prov, mod, func, name) \
-    	prov##_##mod##_##func##_##name
+void sdt_probe_stub(uint32_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t,
+    uintptr_t);
 
-#ifdef KDTRACE_HOOKS
-/*
- * SDT_PROBE_DEFINE(prov, mod, func, name, sname,
- *		    arg0, argx0, arg1, argx1,
- *		    arg2, argx2, arg3, argx3, arg4, argx4)
- *
- * 	prov	- provider name
- * 	mod	- module name
- * 	func	- function name
- * 	name	- probe name
- * 	sname	- probe name as exposed to userland
- * 	arg0 - arg4, argument types as strings, or NULL.
- * 	argx0 - argx4, translation types for arg0 - arg4
- *
- * 	e.g. SDT_PROBE_DEFINE(l7, l7lb, l7lb_create_node, 
- * 				"void *", NULL, 
- * 				NULL, NULL, NULL, NULL,
- * 				NULL, NULL, NULL NULL, )
- *
- *	This is used in the target module to define probes to be used.
- *	The translation type should be set to NULL if not used.
- */
-#define SDT_PROBE_DEFINE(prov, mod, func, name, sname, \
-	    arg0, argx0, arg1, argx1, arg2, argx2, \
-	    arg3, argx3, arg4, argx4) \
-    	sdt_probe_t SDT_NAME(prov, mod, func, name) = { \
-	    0, 0, 0, #prov, #mod, #func, #sname, \
-	    { arg0, arg1, arg2, arg3, arg4 }, \
-	    { NULL, NULL, NULL, NULL, NULL } \
-	}
-
-/* Use this in this module to declare probes defined in the kernel. */
-#define SDT_PROBE_DECLARE(prov, mod, func, name) \
-    	extern sdt_probe_t SDT_NAME(prov, mod, func, name);
-
-/* Use this in the target modules to provide instrumentation points */
-#define SDT_PROBE(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4) \
-    	if (__predict_false(SDT_NAME(prov, mod, func, name).enabled)) { \
-	    	(*sdt_probe_func)(SDT_NAME(prov, mod, func, name).id, \
-		    (uintptr_t)(arg0), (uintptr_t)(arg1), (uintptr_t)(arg2), \
-		    (uintptr_t)(arg3), (uintptr_t)(arg4)); \
-	}
-#else
-#define SDT_PROBE_DEFINE(prov, mod, func, name, sname, \
-	    arg0, argx0, arg1, argx1, arg2, argx2, \
-	    arg3, argx3, arg4, argx4)
-#define SDT_PROBE_DECLARE(prov, mod, func, name)
-#define SDT_PROBE(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4) 
-#endif
+SDT_PROVIDER_DECLARE(sdt);
 
-void sdt_init(void *);
+void sdt_init(void *); 
 void sdt_exit(void);
 
-#endif
+
+#endif /* _KERNEL */
+
+#endif /* _SYS_SDT_H */

Reply via email to