diff options
| author | christos <christos@NetBSD.org> | 2015-03-08 22:45:16 +0000 |
|---|---|---|
| committer | christos <christos@NetBSD.org> | 2015-03-08 22:45:16 +0000 |
| commit | e6df83a65039d4cfab2bdc8346acf55e8fcf329d (patch) | |
| tree | 1fb56c3e1450076f922cac9039d8e8181e6f1175 /sys/dev/lockstat.c | |
| parent | 42f7e7f2ae51aeaae06bdd45eba11f7f6443ea39 (diff) | |
dtrace bits from riastradh
Diffstat (limited to 'sys/dev/lockstat.c')
| -rw-r--r-- | sys/dev/lockstat.c | 26 |
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) |
