From efe8b26b82a7fc541e2f6a112ce34bf7a3d84973 Mon Sep 17 00:00:00 2001 From: Mark Johnston Date: Sat, 18 Jul 2015 00:22:00 +0000 Subject: [PATCH] Modify lockstat_nsecs() to just return unless lockstat probes are actually enabled. The cost of a timecounter read can be quite significant, and the problem became more apparent after r284297, since that change resulted in a call to lockstat_nsecs() for each acquisition of an rwlock read lock. PR: 201642 Reviewed by: avg Tested by: Jason Unovitch MFC after: 3 days Differential Revision: https://reviews.freebsd.org/D3073 --- sys/cddl/dev/lockstat/lockstat.c | 4 ++++ sys/kern/kern_lockstat.c | 5 ++++- sys/sys/lockstat.h | 1 + 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/sys/cddl/dev/lockstat/lockstat.c b/sys/cddl/dev/lockstat/lockstat.c index 71a863219b1d..a6cabc8d5f3f 100644 --- a/sys/cddl/dev/lockstat/lockstat.c +++ b/sys/cddl/dev/lockstat/lockstat.c @@ -159,6 +159,8 @@ lockstat_enable(void *arg, dtrace_id_t id, void *parg) ASSERT(!lockstat_probemap[probe->lsp_probe]); + lockstat_enabled++; + lockstat_probemap[probe->lsp_probe] = id; #ifdef DOODAD membar_producer(); @@ -182,6 +184,8 @@ lockstat_disable(void *arg, dtrace_id_t id, void *parg) ASSERT(lockstat_probemap[probe->lsp_probe]); + lockstat_enabled--; + lockstat_probemap[probe->lsp_probe] = 0; #ifdef DOODAD lockstat_hot_patch(); diff --git a/sys/kern/kern_lockstat.c b/sys/kern/kern_lockstat.c index 1c773128da99..eb7e177622c1 100644 --- a/sys/kern/kern_lockstat.c +++ b/sys/kern/kern_lockstat.c @@ -45,7 +45,7 @@ uint32_t lockstat_probemap[LS_NPROBES]; void (*lockstat_probe_func)(uint32_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t); - +int lockstat_enabled = 0; uint64_t lockstat_nsecs(void) @@ -53,6 +53,9 @@ lockstat_nsecs(void) struct bintime bt; uint64_t ns; + if (!lockstat_enabled) + return (0); + binuptime(&bt); ns = bt.sec * (uint64_t)1000000000; ns += ((uint64_t)1000000000 * (uint32_t)(bt.frac >> 32)) >> 32; diff --git a/sys/sys/lockstat.h b/sys/sys/lockstat.h index 2a7853fb95bf..b550e8d27c34 100644 --- a/sys/sys/lockstat.h +++ b/sys/sys/lockstat.h @@ -154,6 +154,7 @@ typedef void (*lockstat_probe_func_t)(uint32_t, uintptr_t arg0, uintptr_t arg1, uintptr_t arg2, uintptr_t arg3, uintptr_t arg4); extern lockstat_probe_func_t lockstat_probe_func; extern uint64_t lockstat_nsecs(void); +extern int lockstat_enabled; #ifdef KDTRACE_HOOKS /*