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