svn commit: r332901 - in head/sys: cddl/dev/dtmalloc kern
Mateusz Guzik
mjg at FreeBSD.org
Tue Apr 24 01:06:21 UTC 2018
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,
More information about the svn-src-head
mailing list