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 <[email protected]>
*
* 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 */