Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 24 Apr 2018 01:06:20 +0000 (UTC)
From:      Mateusz Guzik <mjg@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r332901 - in head/sys: cddl/dev/dtmalloc kern
Message-ID:  <201804240106.w3O16KY3046619@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mjg
Date: Tue Apr 24 01:06:20 2018
New Revision: 332901
URL: https://svnweb.freebsd.org/changeset/base/332901

Log:
  dtrace: depessimize dtmalloc when dtrace is active
  
  Each malloc/free was testing dtrace_malloc_enabled and forcing
  extra reads from the malloc type struct to see if perhaps a
  dtmalloc probe was on.
  
  Treat it like lockstat and sdt: have a global bolean.

Modified:
  head/sys/cddl/dev/dtmalloc/dtmalloc.c
  head/sys/kern/kern_malloc.c

Modified: head/sys/cddl/dev/dtmalloc/dtmalloc.c
==============================================================================
--- head/sys/cddl/dev/dtmalloc/dtmalloc.c	Tue Apr 24 01:04:10 2018	(r332900)
+++ head/sys/cddl/dev/dtmalloc/dtmalloc.c	Tue Apr 24 01:06:20 2018	(r332901)
@@ -36,6 +36,9 @@
 #include <sys/dtrace.h>
 #include <sys/dtrace_bsd.h>
 
+extern bool dtrace_malloc_enabled;
+static uint32_t dtrace_malloc_enabled_count;
+
 static d_open_t	dtmalloc_open;
 static int	dtmalloc_unload(void);
 static void	dtmalloc_getargdesc(void *, dtrace_id_t, void *, dtrace_argdesc_t *);
@@ -152,6 +155,9 @@ dtmalloc_enable(void *arg, dtrace_id_t id, void *parg)
 {
 	uint32_t *p = parg;
 	*p = id;
+	dtrace_malloc_enabled_count++;
+	if (dtrace_malloc_enabled_count == 1)
+		dtrace_malloc_enabled = true;
 }
 
 static void
@@ -159,6 +165,9 @@ dtmalloc_disable(void *arg, dtrace_id_t id, void *parg
 {
 	uint32_t *p = parg;
 	*p = 0;
+	dtrace_malloc_enabled_count--;
+	if (dtrace_malloc_enabled_count == 0)
+		dtrace_malloc_enabled = false;
 }
 
 static void

Modified: head/sys/kern/kern_malloc.c
==============================================================================
--- head/sys/kern/kern_malloc.c	Tue Apr 24 01:04:10 2018	(r332900)
+++ head/sys/kern/kern_malloc.c	Tue Apr 24 01:06:20 2018	(r332901)
@@ -93,7 +93,8 @@ __FBSDID("$FreeBSD$");
 #ifdef KDTRACE_HOOKS
 #include <sys/dtrace_bsd.h>
 
-dtrace_malloc_probe_func_t	dtrace_malloc_probe;
+bool	__read_frequently			dtrace_malloc_enabled;
+dtrace_malloc_probe_func_t __read_mostly	dtrace_malloc_probe;
 #endif
 
 #if defined(INVARIANTS) || defined(MALLOC_MAKE_FAILURES) ||		\
@@ -376,7 +377,7 @@ malloc_type_zone_allocated(struct malloc_type *mtp, un
 		mtsp->mts_size |= 1 << zindx;
 
 #ifdef KDTRACE_HOOKS
-	if (dtrace_malloc_probe != NULL) {
+	if (__predict_false(dtrace_malloc_enabled)) {
 		uint32_t probe_id = mtip->mti_probes[DTMALLOC_PROBE_MALLOC];
 		if (probe_id != 0)
 			(dtrace_malloc_probe)(probe_id,
@@ -415,7 +416,7 @@ malloc_type_freed(struct malloc_type *mtp, unsigned lo
 	mtsp->mts_numfrees++;
 
 #ifdef KDTRACE_HOOKS
-	if (dtrace_malloc_probe != NULL) {
+	if (__predict_false(dtrace_malloc_enabled)) {
 		uint32_t probe_id = mtip->mti_probes[DTMALLOC_PROBE_FREE];
 		if (probe_id != 0)
 			(dtrace_malloc_probe)(probe_id,



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201804240106.w3O16KY3046619>