Author: markj Date: Sat Jul 18 00:22:00 2015 New Revision: 285663 URL: https://svnweb.freebsd.org/changeset/base/285663
Log: 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 Modified: head/sys/cddl/dev/lockstat/lockstat.c head/sys/kern/kern_lockstat.c head/sys/sys/lockstat.h Modified: head/sys/cddl/dev/lockstat/lockstat.c ============================================================================== --- head/sys/cddl/dev/lockstat/lockstat.c Fri Jul 17 23:30:43 2015 (r285662) +++ head/sys/cddl/dev/lockstat/lockstat.c Sat Jul 18 00:22:00 2015 (r285663) @@ -159,6 +159,8 @@ lockstat_enable(void *arg, dtrace_id_t i 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 ASSERT(lockstat_probemap[probe->lsp_probe]); + lockstat_enabled--; + lockstat_probemap[probe->lsp_probe] = 0; #ifdef DOODAD lockstat_hot_patch(); Modified: head/sys/kern/kern_lockstat.c ============================================================================== --- head/sys/kern/kern_lockstat.c Fri Jul 17 23:30:43 2015 (r285662) +++ head/sys/kern/kern_lockstat.c Sat Jul 18 00:22:00 2015 (r285663) @@ -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; Modified: head/sys/sys/lockstat.h ============================================================================== --- head/sys/sys/lockstat.h Fri Jul 17 23:30:43 2015 (r285662) +++ head/sys/sys/lockstat.h Sat Jul 18 00:22:00 2015 (r285663) @@ -154,6 +154,7 @@ typedef void (*lockstat_probe_func_t)(ui 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 /* _______________________________________________ svn-src-head@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/svn-src-head To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"