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"

Reply via email to