summaryrefslogtreecommitdiff
path: root/sys/dev/lockstat.c
diff options
context:
space:
mode:
authorchristos <christos@NetBSD.org>2015-03-08 22:45:16 +0000
committerchristos <christos@NetBSD.org>2015-03-08 22:45:16 +0000
commite6df83a65039d4cfab2bdc8346acf55e8fcf329d (patch)
tree1fb56c3e1450076f922cac9039d8e8181e6f1175 /sys/dev/lockstat.c
parent42f7e7f2ae51aeaae06bdd45eba11f7f6443ea39 (diff)
dtrace bits from riastradh
Diffstat (limited to 'sys/dev/lockstat.c')
-rw-r--r--sys/dev/lockstat.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/sys/dev/lockstat.c b/sys/dev/lockstat.c
index 9884fdd8bed..fb1a8da7ea0 100644
--- a/sys/dev/lockstat.c
+++ b/sys/dev/lockstat.c
@@ -1,4 +1,4 @@
-/* $NetBSD: lockstat.c,v 1.19 2014/07/25 08:10:35 dholland Exp $ */
+/* $NetBSD: lockstat.c,v 1.20 2015/03/08 22:45:16 christos Exp $ */
/*-
* Copyright (c) 2006, 2007 The NetBSD Foundation, Inc.
@@ -40,7 +40,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lockstat.c,v 1.19 2014/07/25 08:10:35 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lockstat.c,v 1.20 2015/03/08 22:45:16 christos Exp $");
#include <sys/types.h>
#include <sys/param.h>
@@ -110,6 +110,20 @@ size_t lockstat_sizeb;
int lockstat_busy;
struct timespec lockstat_stime;
+#ifdef KDTRACE_HOOKS
+CTASSERT(LB_NEVENT <= 3);
+CTASSERT(LB_NLOCK <= (7 << LB_LOCK_SHIFT));
+void
+lockstat_probe_stub(uint32_t id, uintptr_t lock, uintptr_t callsite,
+ uintptr_t flags, uintptr_t count, uintptr_t cycles)
+{
+}
+
+uint32_t lockstat_probemap[LS_NPROBES];
+void (*lockstat_probe_func)(uint32_t, uintptr_t, uintptr_t,
+ uintptr_t, uintptr_t, uintptr_t) = &lockstat_probe_stub;
+#endif
+
const struct cdevsw lockstat_cdevsw = {
.d_open = lockstat_open,
.d_close = lockstat_close,
@@ -344,6 +358,14 @@ lockstat_event(uintptr_t lock, uintptr_t callsite, u_int flags, u_int count,
u_int event;
int s;
+#ifdef KDTRACE_HOOKS
+ uint32_t id;
+ CTASSERT((LS_NPROBES & (LS_NPROBES - 1)) == 0);
+ if ((id = lockstat_probemap[LS_COMPRESS(flags)]) != 0)
+ (*lockstat_probe_func)(id, lock, callsite, flags, count,
+ cycles);
+#endif
+
if ((flags & lockstat_enabled) != flags || count == 0)
return;
if (lock < lockstat_lockstart || lock > lockstat_lockend)