summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJason Evans <jasone@canonware.com>2017-04-25 00:28:55 (GMT)
committerJason Evans <jasone@canonware.com>2017-04-25 03:37:16 (GMT)
commitc67c3e4a63277718b9d137a38663c6ae324c99aa (patch)
tree18d2f1f3a5eaaa0b5549c64691e6ed16c3c9f47c /src
parente2cc6280ed96e2e6a2754d4e7187296e377d9548 (diff)
downloadjemalloc-c67c3e4a63277718b9d137a38663c6ae324c99aa.zip
jemalloc-c67c3e4a63277718b9d137a38663c6ae324c99aa.tar.gz
jemalloc-c67c3e4a63277718b9d137a38663c6ae324c99aa.tar.bz2
Replace --disable-munmap with opt.munmap.
Control use of munmap(2) via a run-time option rather than a compile-time option (with the same per platform default). The old behavior of --disable-munmap can be achieved with --with-malloc-conf=munmap:false. This partially resolves #580.
Diffstat (limited to 'src')
-rw-r--r--src/arena.c4
-rw-r--r--src/ctl.c6
-rw-r--r--src/extent.c2
-rw-r--r--src/extent_mmap.c15
-rw-r--r--src/jemalloc.c38
-rw-r--r--src/large.c2
-rw-r--r--src/stats.c2
7 files changed, 37 insertions, 32 deletions
diff --git a/src/arena.c b/src/arena.c
index 1288b7b..3b94a20 100644
--- a/src/arena.c
+++ b/src/arena.c
@@ -1143,7 +1143,7 @@ arena_destroy_retained(tsdn_t *tsdn, arena_t *arena) {
* opportunity to unmap all retained memory without having to keep its
* own metadata structures, but if deallocation fails, that is the
* application's decision/problem. In practice, retained extents are
- * leaked here if !config_munmap unless the application provided custom
+ * leaked here if !opt_munmap unless the application provided custom
* extent hooks, so best practice is to either enable munmap (and avoid
* dss for arenas to be destroyed), or provide custom extent hooks that
* either unmap retained extents or track them for later use.
@@ -1947,7 +1947,7 @@ arena_new(tsdn_t *tsdn, unsigned ind, extent_hooks_t *extent_hooks) {
goto label_error;
}
- if (!config_munmap) {
+ if (!opt_munmap) {
atomic_store_u(&arena->extent_grow_next, psz2ind(HUGEPAGE),
ATOMIC_RELAXED);
}
diff --git a/src/ctl.c b/src/ctl.c
index c054ded..8c2e7bc 100644
--- a/src/ctl.c
+++ b/src/ctl.c
@@ -66,7 +66,6 @@ CTL_PROTO(config_debug)
CTL_PROTO(config_fill)
CTL_PROTO(config_lazy_lock)
CTL_PROTO(config_malloc_conf)
-CTL_PROTO(config_munmap)
CTL_PROTO(config_prof)
CTL_PROTO(config_prof_libgcc)
CTL_PROTO(config_prof_libunwind)
@@ -74,6 +73,7 @@ CTL_PROTO(config_stats)
CTL_PROTO(config_utrace)
CTL_PROTO(config_xmalloc)
CTL_PROTO(opt_abort)
+CTL_PROTO(opt_munmap)
CTL_PROTO(opt_dss)
CTL_PROTO(opt_narenas)
CTL_PROTO(opt_percpu_arena)
@@ -249,7 +249,6 @@ static const ctl_named_node_t config_node[] = {
{NAME("fill"), CTL(config_fill)},
{NAME("lazy_lock"), CTL(config_lazy_lock)},
{NAME("malloc_conf"), CTL(config_malloc_conf)},
- {NAME("munmap"), CTL(config_munmap)},
{NAME("prof"), CTL(config_prof)},
{NAME("prof_libgcc"), CTL(config_prof_libgcc)},
{NAME("prof_libunwind"), CTL(config_prof_libunwind)},
@@ -260,6 +259,7 @@ static const ctl_named_node_t config_node[] = {
static const ctl_named_node_t opt_node[] = {
{NAME("abort"), CTL(opt_abort)},
+ {NAME("munmap"), CTL(opt_munmap)},
{NAME("dss"), CTL(opt_dss)},
{NAME("narenas"), CTL(opt_narenas)},
{NAME("percpu_arena"), CTL(opt_percpu_arena)},
@@ -1444,7 +1444,6 @@ CTL_RO_CONFIG_GEN(config_debug, bool)
CTL_RO_CONFIG_GEN(config_fill, bool)
CTL_RO_CONFIG_GEN(config_lazy_lock, bool)
CTL_RO_CONFIG_GEN(config_malloc_conf, const char *)
-CTL_RO_CONFIG_GEN(config_munmap, bool)
CTL_RO_CONFIG_GEN(config_prof, bool)
CTL_RO_CONFIG_GEN(config_prof_libgcc, bool)
CTL_RO_CONFIG_GEN(config_prof_libunwind, bool)
@@ -1455,6 +1454,7 @@ CTL_RO_CONFIG_GEN(config_xmalloc, bool)
/******************************************************************************/
CTL_RO_NL_GEN(opt_abort, opt_abort, bool)
+CTL_RO_NL_GEN(opt_munmap, opt_munmap, bool)
CTL_RO_NL_GEN(opt_dss, opt_dss, const char *)
CTL_RO_NL_GEN(opt_narenas, opt_narenas, unsigned)
CTL_RO_NL_GEN(opt_percpu_arena, opt_percpu_arena, const char *)
diff --git a/src/extent.c b/src/extent.c
index d08ccdb..1ddaf24 100644
--- a/src/extent.c
+++ b/src/extent.c
@@ -1123,7 +1123,7 @@ extent_alloc_retained(tsdn_t *tsdn, arena_t *arena,
extent_gdump_add(tsdn, extent);
}
}
- if (!config_munmap && extent == NULL) {
+ if (!opt_munmap && extent == NULL) {
extent = extent_grow_retained(tsdn, arena, r_extent_hooks,
new_addr, size, pad, alignment, slab, szind, zero, commit);
}
diff --git a/src/extent_mmap.c b/src/extent_mmap.c
index be09937..5fe82ee 100644
--- a/src/extent_mmap.c
+++ b/src/extent_mmap.c
@@ -5,6 +5,17 @@
#include "jemalloc/internal/assert.h"
/******************************************************************************/
+/* Data. */
+
+bool opt_munmap =
+#ifdef JEMALLOC_MUNMAP
+ true
+#else
+ false
+#endif
+ ;
+
+/******************************************************************************/
void *
extent_alloc_mmap(void *new_addr, size_t size, size_t alignment, bool *zero,
@@ -23,8 +34,8 @@ extent_alloc_mmap(void *new_addr, size_t size, size_t alignment, bool *zero,
bool
extent_dalloc_mmap(void *addr, size_t size) {
- if (config_munmap) {
+ if (opt_munmap) {
pages_unmap(addr, size);
}
- return !config_munmap;
+ return !opt_munmap;
}
diff --git a/src/jemalloc.c b/src/jemalloc.c
index 602cf67..5e1f0a7 100644
--- a/src/jemalloc.c
+++ b/src/jemalloc.c
@@ -947,7 +947,7 @@ malloc_conf_init(void) {
(sizeof(n)-1 == klen && strncmp(n, k, klen) == 0)
#define CONF_MATCH_VALUE(n) \
(sizeof(n)-1 == vlen && strncmp(n, v, vlen) == 0)
-#define CONF_HANDLE_BOOL(o, n, cont) \
+#define CONF_HANDLE_BOOL(o, n) \
if (CONF_MATCH(n)) { \
if (CONF_MATCH_VALUE("true")) { \
o = true; \
@@ -958,9 +958,7 @@ malloc_conf_init(void) {
"Invalid conf value", \
k, klen, v, vlen); \
} \
- if (cont) { \
- continue; \
- } \
+ continue; \
}
#define CONF_MIN_no(um, min) false
#define CONF_MIN_yes(um, min) ((um) < (min))
@@ -1043,7 +1041,8 @@ malloc_conf_init(void) {
continue; \
}
- CONF_HANDLE_BOOL(opt_abort, "abort", true)
+ CONF_HANDLE_BOOL(opt_abort, "abort")
+ CONF_HANDLE_BOOL(opt_munmap, "munmap")
if (strncmp("dss", k, klen) == 0) {
int i;
bool match = false;
@@ -1074,7 +1073,7 @@ malloc_conf_init(void) {
"dirty_decay_time", -1, NSTIME_SEC_MAX);
CONF_HANDLE_SSIZE_T(opt_muzzy_decay_time,
"muzzy_decay_time", -1, NSTIME_SEC_MAX);
- CONF_HANDLE_BOOL(opt_stats_print, "stats_print", true)
+ CONF_HANDLE_BOOL(opt_stats_print, "stats_print")
if (config_fill) {
if (CONF_MATCH("junk")) {
if (CONF_MATCH_VALUE("true")) {
@@ -1100,15 +1099,15 @@ malloc_conf_init(void) {
}
continue;
}
- CONF_HANDLE_BOOL(opt_zero, "zero", true)
+ CONF_HANDLE_BOOL(opt_zero, "zero")
}
if (config_utrace) {
- CONF_HANDLE_BOOL(opt_utrace, "utrace", true)
+ CONF_HANDLE_BOOL(opt_utrace, "utrace")
}
if (config_xmalloc) {
- CONF_HANDLE_BOOL(opt_xmalloc, "xmalloc", true)
+ CONF_HANDLE_BOOL(opt_xmalloc, "xmalloc")
}
- CONF_HANDLE_BOOL(opt_tcache, "tcache", true)
+ CONF_HANDLE_BOOL(opt_tcache, "tcache")
CONF_HANDLE_SSIZE_T(opt_lg_tcache_max, "lg_tcache_max",
-1, (sizeof(size_t) << 3) - 1)
if (strncmp("percpu_arena", k, klen) == 0) {
@@ -1136,27 +1135,22 @@ malloc_conf_init(void) {
continue;
}
if (config_prof) {
- CONF_HANDLE_BOOL(opt_prof, "prof", true)
+ CONF_HANDLE_BOOL(opt_prof, "prof")
CONF_HANDLE_CHAR_P(opt_prof_prefix,
"prof_prefix", "jeprof")
- CONF_HANDLE_BOOL(opt_prof_active, "prof_active",
- true)
+ CONF_HANDLE_BOOL(opt_prof_active, "prof_active")
CONF_HANDLE_BOOL(opt_prof_thread_active_init,
- "prof_thread_active_init", true)
+ "prof_thread_active_init")
CONF_HANDLE_SIZE_T(opt_lg_prof_sample,
"lg_prof_sample", 0, (sizeof(uint64_t) << 3)
- 1, no, yes, true)
- CONF_HANDLE_BOOL(opt_prof_accum, "prof_accum",
- true)
+ CONF_HANDLE_BOOL(opt_prof_accum, "prof_accum")
CONF_HANDLE_SSIZE_T(opt_lg_prof_interval,
"lg_prof_interval", -1,
(sizeof(uint64_t) << 3) - 1)
- CONF_HANDLE_BOOL(opt_prof_gdump, "prof_gdump",
- true)
- CONF_HANDLE_BOOL(opt_prof_final, "prof_final",
- true)
- CONF_HANDLE_BOOL(opt_prof_leak, "prof_leak",
- true)
+ CONF_HANDLE_BOOL(opt_prof_gdump, "prof_gdump")
+ CONF_HANDLE_BOOL(opt_prof_final, "prof_final")
+ CONF_HANDLE_BOOL(opt_prof_leak, "prof_leak")
}
malloc_conf_error("Invalid conf pair", k, klen, v,
vlen);
diff --git a/src/large.c b/src/large.c
index 36e8be9..4d515fb 100644
--- a/src/large.c
+++ b/src/large.c
@@ -93,7 +93,7 @@ large_dalloc_maybe_junk(void *ptr, size_t size) {
* Only bother junk filling if the extent isn't about to be
* unmapped.
*/
- if (!config_munmap || (have_dss && extent_in_dss(ptr))) {
+ if (!opt_munmap || (have_dss && extent_in_dss(ptr))) {
large_dalloc_junk(ptr, size);
}
}
diff --git a/src/stats.c b/src/stats.c
index 71c9a94..ca9db89 100644
--- a/src/stats.c
+++ b/src/stats.c
@@ -707,7 +707,6 @@ stats_general_print(void (*write_cb)(void *, const char *), void *cbopaque,
"config.malloc_conf: \"%s\"\n", config_malloc_conf);
}
- CONFIG_WRITE_BOOL_JSON(munmap, ",")
CONFIG_WRITE_BOOL_JSON(prof, ",")
CONFIG_WRITE_BOOL_JSON(prof_libgcc, ",")
CONFIG_WRITE_BOOL_JSON(prof_libunwind, ",")
@@ -801,6 +800,7 @@ stats_general_print(void (*write_cb)(void *, const char *), void *cbopaque,
"Run-time option settings:\n");
}
OPT_WRITE_BOOL(abort, ",")
+ OPT_WRITE_BOOL(munmap, ",")
OPT_WRITE_CHAR_P(dss, ",")
OPT_WRITE_UNSIGNED(narenas, ",")
OPT_WRITE_CHAR_P(percpu_arena, ",")