[PATCH] Add a build option to freeze the number of arenas to 1
Mike Hommey
mh+jemalloc at glandium.org
Thu Feb 23 04:49:09 PST 2012
From: Mike Hommey <mh at glandium.org>
---
Mozilla does not currently make extensive use of concurrent allocation,
so the increased fragmentation associated with multiple arenas is not
warranted.
configure.ac | 4 ++++
include/jemalloc/internal/jemalloc_internal.h.in | 8 ++++++++
include/jemalloc/jemalloc_defs.h.in | 3 +++
src/jemalloc.c | 10 ++++++++++
4 files changed, 25 insertions(+), 0 deletions(-)
diff --git a/configure.ac b/configure.ac
index 704a703..4cc7d6f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -787,6 +787,10 @@ if test "x${enable_tls}" = "x0" ; then
AC_DEFINE_UNQUOTED([NO_TLS], [ ])
fi
+AC_ARG_WITH([one_arena],
+ [AS_HELP_STRING([--with-one-arena], [Force jemalloc to use only one arena])],
+ [AC_DEFINE([JEMALLOC_ONE_ARENA])])
+
dnl ============================================================================
dnl Check for ffsl(3), and fail if not found. This function exists on all
dnl platforms that jemalloc currently has a chance of functioning on without
diff --git a/include/jemalloc/internal/jemalloc_internal.h.in b/include/jemalloc/internal/jemalloc_internal.h.in
index 971336e..75b4b66 100644
--- a/include/jemalloc/internal/jemalloc_internal.h.in
+++ b/include/jemalloc/internal/jemalloc_internal.h.in
@@ -384,7 +384,11 @@ extern bool opt_junk;
extern bool opt_sysv;
extern bool opt_xmalloc;
extern bool opt_zero;
+#ifdef JEMALLOC_ONE_ARENA
+static const size_t opt_narenas = 1;
+#else
extern size_t opt_narenas;
+#endif
#ifdef DYNAMIC_PAGE_SHIFT
extern size_t pagesize;
@@ -420,7 +424,11 @@ extern __thread arena_t *arenas_tls JEMALLOC_ATTR(tls_model("initial-exec"));
* arenas array are necessarily used; arenas are created lazily as needed.
*/
extern arena_t **arenas;
+#ifdef JEMALLOC_ONE_ARENA
+static const unsigned narenas = 1;
+#else
extern unsigned narenas;
+#endif
#ifndef NO_TLS
extern __thread thread_allocated_t thread_allocated_tls;
diff --git a/include/jemalloc/jemalloc_defs.h.in b/include/jemalloc/jemalloc_defs.h.in
index 18cad28..e7e12d5 100644
--- a/include/jemalloc/jemalloc_defs.h.in
+++ b/include/jemalloc/jemalloc_defs.h.in
@@ -128,6 +128,9 @@
/* TLS is used to map arenas and magazine caches to threads. */
#undef NO_TLS
+/* Forces jemalloc to use only one arena when defined */
+#undef JEMALLOC_ONE_ARENA
+
/*
* JEMALLOC_IVSALLOC enables ivsalloc(), which verifies that pointers reside
* within jemalloc-owned chunks before dereferencing them.
diff --git a/src/jemalloc.c b/src/jemalloc.c
index 8b927f8..540f211 100644
--- a/src/jemalloc.c
+++ b/src/jemalloc.c
@@ -6,7 +6,9 @@
malloc_mutex_t arenas_lock;
arena_t **arenas;
+#ifndef JEMALLOC_ONE_ARENA
unsigned narenas;
+#endif
pthread_key_t arenas_tsd;
#ifndef NO_TLS
@@ -51,7 +53,9 @@ bool opt_junk = false;
bool opt_sysv = false;
bool opt_xmalloc = false;
bool opt_zero = false;
+#ifndef JEMALLOC_ONE_ARENA
size_t opt_narenas = 0;
+#endif
/******************************************************************************/
/* Function prototypes for non-inline static functions. */
@@ -573,7 +577,9 @@ malloc_conf_init(void)
*/
CONF_HANDLE_SIZE_T(lg_chunk, PAGE_SHIFT+1,
(sizeof(size_t) << 3) - 1)
+#ifndef JEMALLOC_ONE_ARENA
CONF_HANDLE_SIZE_T(narenas, 1, SIZE_T_MAX)
+#endif
CONF_HANDLE_SSIZE_T(lg_dirty_mult, -1,
(sizeof(size_t) << 3) - 1)
CONF_HANDLE_BOOL(stats_print)
@@ -745,7 +751,9 @@ malloc_init_hard(void)
* Create enough scaffolding to allow recursive allocation in
* malloc_ncpus().
*/
+#ifndef JEMALLOC_ONE_ARENA
narenas = 1;
+#endif
arenas = init_arenas;
memset(arenas, 0, sizeof(arena_t *) * narenas);
@@ -778,6 +786,7 @@ malloc_init_hard(void)
ncpus = malloc_ncpus();
malloc_mutex_lock(&init_lock);
+#ifndef JEMALLOC_ONE_ARENA
if (opt_narenas == 0) {
/*
* For SMP systems, create more than one arena per CPU by
@@ -802,6 +811,7 @@ malloc_init_hard(void)
malloc_write(u2s(narenas, 10, buf));
malloc_write(")\n");
}
+#endif
/* Allocate and initialize arenas. */
arenas = (arena_t **)base_alloc(sizeof(arena_t *) * narenas);
--
1.7.9.1
More information about the jemalloc-discuss
mailing list