From owner-svn-src-all@freebsd.org Sat Jul 18 00:22:02 2015 Return-Path: Delivered-To: svn-src-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id B6BCD9A4F3A; Sat, 18 Jul 2015 00:22:02 +0000 (UTC) (envelope-from markj@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 89A6A1DDB; Sat, 18 Jul 2015 00:22:02 +0000 (UTC) (envelope-from markj@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.70]) by repo.freebsd.org (8.14.9/8.14.9) with ESMTP id t6I0M20U063833; Sat, 18 Jul 2015 00:22:02 GMT (envelope-from markj@FreeBSD.org) Received: (from markj@localhost) by repo.freebsd.org (8.14.9/8.14.9/Submit) id t6I0M1nj063830; Sat, 18 Jul 2015 00:22:01 GMT (envelope-from markj@FreeBSD.org) Message-Id: <201507180022.t6I0M1nj063830@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: markj set sender to markj@FreeBSD.org using -f From: Mark Johnston Date: Sat, 18 Jul 2015 00:22:01 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r285663 - in head/sys: cddl/dev/lockstat kern sys X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 18 Jul 2015 00:22:02 -0000 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 /*