Add the --enable-mremap option.
Add the --enable-mremap option, and disable the use of mremap(2) by default, for the same reason that freeing chunks via munmap(2) is disabled by default on Linux: semi-permanent VM map fragmentation.
This commit is contained in:
parent
374d26a43b
commit
2e671ffbad
6
INSTALL
6
INSTALL
@ -108,6 +108,12 @@ any of the following arguments (not a definitive list) to 'configure':
|
|||||||
released in bulk, thus reducing the total number of mutex operations. See
|
released in bulk, thus reducing the total number of mutex operations. See
|
||||||
the "opt.tcache" option for usage details.
|
the "opt.tcache" option for usage details.
|
||||||
|
|
||||||
|
--enable-mremap
|
||||||
|
Enable huge realloc() via mremap(2). mremap() is disabled by default
|
||||||
|
because the flavor used is specific to Linux, which has a quirk in its
|
||||||
|
virtual memory allocation algorithm that causes semi-permanent VM map holes
|
||||||
|
under normal jemalloc operation.
|
||||||
|
|
||||||
--disable-munmap
|
--disable-munmap
|
||||||
Disable virtual memory deallocation via munmap(2); instead keep track of
|
Disable virtual memory deallocation via munmap(2); instead keep track of
|
||||||
the virtual memory for later use. munmap() is disabled by default (i.e.
|
the virtual memory for later use. munmap() is disabled by default (i.e.
|
||||||
|
38
configure.ac
38
configure.ac
@ -372,16 +372,6 @@ else
|
|||||||
AC_DEFINE([JEMALLOC_TLS_MODEL], [ ])
|
AC_DEFINE([JEMALLOC_TLS_MODEL], [ ])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
JE_COMPILABLE([mremap(...MREMAP_FIXED...)], [
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <sys/mman.h>
|
|
||||||
], [
|
|
||||||
void *p = mremap((void *)0, 0, 0, MREMAP_MAYMOVE|MREMAP_FIXED, (void *)0);
|
|
||||||
], [je_cv_mremap_fixed])
|
|
||||||
if test "x${je_cv_mremap_fixed}" = "xyes" ; then
|
|
||||||
AC_DEFINE([JEMALLOC_MREMAP_FIXED], [ ])
|
|
||||||
fi
|
|
||||||
|
|
||||||
dnl Support optional additions to rpath.
|
dnl Support optional additions to rpath.
|
||||||
AC_ARG_WITH([rpath],
|
AC_ARG_WITH([rpath],
|
||||||
[AS_HELP_STRING([--with-rpath=<rpath>], [Colon-separated rpath (ELF systems only)])],
|
[AS_HELP_STRING([--with-rpath=<rpath>], [Colon-separated rpath (ELF systems only)])],
|
||||||
@ -743,6 +733,33 @@ if test "x$enable_tcache" = "x1" ; then
|
|||||||
fi
|
fi
|
||||||
AC_SUBST([enable_tcache])
|
AC_SUBST([enable_tcache])
|
||||||
|
|
||||||
|
dnl Disable mremap() for huge realloc() by default.
|
||||||
|
AC_ARG_ENABLE([mremap],
|
||||||
|
[AS_HELP_STRING([--enable-mremap], [Enable mremap(2) for huge realloc()])],
|
||||||
|
[if test "x$enable_mremap" = "xno" ; then
|
||||||
|
enable_mremap="0"
|
||||||
|
else
|
||||||
|
enable_mremap="1"
|
||||||
|
fi
|
||||||
|
],
|
||||||
|
[enable_mremap="0"]
|
||||||
|
)
|
||||||
|
if test "x$enable_mremap" = "x1" ; then
|
||||||
|
JE_COMPILABLE([mremap(...MREMAP_FIXED...)], [
|
||||||
|
#define _GNU_SOURCE
|
||||||
|
#include <sys/mman.h>
|
||||||
|
], [
|
||||||
|
void *p = mremap((void *)0, 0, 0, MREMAP_MAYMOVE|MREMAP_FIXED, (void *)0);
|
||||||
|
], [je_cv_mremap_fixed])
|
||||||
|
if test "x${je_cv_mremap_fixed}" = "xno" ; then
|
||||||
|
enable_mremap="0"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if test "x$enable_mremap" = "x1" ; then
|
||||||
|
AC_DEFINE([JEMALLOC_MREMAP], [ ])
|
||||||
|
fi
|
||||||
|
AC_SUBST([enable_mremap])
|
||||||
|
|
||||||
dnl Enable VM deallocation via munmap() by default.
|
dnl Enable VM deallocation via munmap() by default.
|
||||||
AC_ARG_ENABLE([munmap],
|
AC_ARG_ENABLE([munmap],
|
||||||
[AS_HELP_STRING([--disable-munmap], [Disable VM deallocation via munmap(2)])],
|
[AS_HELP_STRING([--disable-munmap], [Disable VM deallocation via munmap(2)])],
|
||||||
@ -1261,6 +1278,7 @@ AC_MSG_RESULT([fill : ${enable_fill}])
|
|||||||
AC_MSG_RESULT([utrace : ${enable_utrace}])
|
AC_MSG_RESULT([utrace : ${enable_utrace}])
|
||||||
AC_MSG_RESULT([valgrind : ${enable_valgrind}])
|
AC_MSG_RESULT([valgrind : ${enable_valgrind}])
|
||||||
AC_MSG_RESULT([xmalloc : ${enable_xmalloc}])
|
AC_MSG_RESULT([xmalloc : ${enable_xmalloc}])
|
||||||
|
AC_MSG_RESULT([mremap : ${enable_mremap}])
|
||||||
AC_MSG_RESULT([munmap : ${enable_munmap}])
|
AC_MSG_RESULT([munmap : ${enable_munmap}])
|
||||||
AC_MSG_RESULT([dss : ${enable_dss}])
|
AC_MSG_RESULT([dss : ${enable_dss}])
|
||||||
AC_MSG_RESULT([lazy_lock : ${enable_lazy_lock}])
|
AC_MSG_RESULT([lazy_lock : ${enable_lazy_lock}])
|
||||||
|
@ -650,6 +650,16 @@ for (i = 0; i < nbins; i++) {
|
|||||||
during build configuration.</para></listitem>
|
during build configuration.</para></listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term>
|
||||||
|
<mallctl>config.mremap</mallctl>
|
||||||
|
(<type>bool</type>)
|
||||||
|
<literal>r-</literal>
|
||||||
|
</term>
|
||||||
|
<listitem><para><option>--enable-mremap</option> was specified during
|
||||||
|
build configuration.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term>
|
<term>
|
||||||
<mallctl>config.munmap</mallctl>
|
<mallctl>config.munmap</mallctl>
|
||||||
|
@ -123,6 +123,13 @@ static const bool config_prof_libunwind =
|
|||||||
false
|
false
|
||||||
#endif
|
#endif
|
||||||
;
|
;
|
||||||
|
static const bool config_mremap =
|
||||||
|
#ifdef JEMALLOC_MREMAP
|
||||||
|
true
|
||||||
|
#else
|
||||||
|
false
|
||||||
|
#endif
|
||||||
|
;
|
||||||
static const bool config_munmap =
|
static const bool config_munmap =
|
||||||
#ifdef JEMALLOC_MUNMAP
|
#ifdef JEMALLOC_MUNMAP
|
||||||
true
|
true
|
||||||
|
@ -193,12 +193,18 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* If defined, use munmap() to unmap freed chunks, rather than storing them for
|
* If defined, use munmap() to unmap freed chunks, rather than storing them for
|
||||||
* later reuse. This is automatically disabled if configuration determines
|
* later reuse. This is disabled by default on Linux because common sequences
|
||||||
* that common sequences of mmap()/munmap() calls will cause virtual memory map
|
* of mmap()/munmap() calls will cause virtual memory map holes.
|
||||||
* holes.
|
|
||||||
*/
|
*/
|
||||||
#undef JEMALLOC_MUNMAP
|
#undef JEMALLOC_MUNMAP
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If defined, use mremap(...MREMAP_FIXED...) for huge realloc(). This is
|
||||||
|
* disabled by default because it is Linux-specific and it will cause virtual
|
||||||
|
* memory map holes, much like munmap(2) does.
|
||||||
|
*/
|
||||||
|
#undef JEMALLOC_MREMAP
|
||||||
|
|
||||||
/* TLS is used to map arenas and magazine caches to threads. */
|
/* TLS is used to map arenas and magazine caches to threads. */
|
||||||
#undef JEMALLOC_TLS
|
#undef JEMALLOC_TLS
|
||||||
|
|
||||||
@ -221,9 +227,6 @@
|
|||||||
#undef JEMALLOC_ZONE
|
#undef JEMALLOC_ZONE
|
||||||
#undef JEMALLOC_ZONE_VERSION
|
#undef JEMALLOC_ZONE_VERSION
|
||||||
|
|
||||||
/* If defined, use mremap(...MREMAP_FIXED...) for huge realloc(). */
|
|
||||||
#undef JEMALLOC_MREMAP_FIXED
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Methods for purging unused pages differ between operating systems.
|
* Methods for purging unused pages differ between operating systems.
|
||||||
*
|
*
|
||||||
|
@ -76,6 +76,7 @@ CTL_PROTO(config_debug)
|
|||||||
CTL_PROTO(config_dss)
|
CTL_PROTO(config_dss)
|
||||||
CTL_PROTO(config_fill)
|
CTL_PROTO(config_fill)
|
||||||
CTL_PROTO(config_lazy_lock)
|
CTL_PROTO(config_lazy_lock)
|
||||||
|
CTL_PROTO(config_mremap)
|
||||||
CTL_PROTO(config_munmap)
|
CTL_PROTO(config_munmap)
|
||||||
CTL_PROTO(config_prof)
|
CTL_PROTO(config_prof)
|
||||||
CTL_PROTO(config_prof_libgcc)
|
CTL_PROTO(config_prof_libgcc)
|
||||||
@ -207,6 +208,7 @@ static const ctl_named_node_t config_node[] = {
|
|||||||
{NAME("dss"), CTL(config_dss)},
|
{NAME("dss"), CTL(config_dss)},
|
||||||
{NAME("fill"), CTL(config_fill)},
|
{NAME("fill"), CTL(config_fill)},
|
||||||
{NAME("lazy_lock"), CTL(config_lazy_lock)},
|
{NAME("lazy_lock"), CTL(config_lazy_lock)},
|
||||||
|
{NAME("mremap"), CTL(config_mremap)},
|
||||||
{NAME("munmap"), CTL(config_munmap)},
|
{NAME("munmap"), CTL(config_munmap)},
|
||||||
{NAME("prof"), CTL(config_prof)},
|
{NAME("prof"), CTL(config_prof)},
|
||||||
{NAME("prof_libgcc"), CTL(config_prof_libgcc)},
|
{NAME("prof_libgcc"), CTL(config_prof_libgcc)},
|
||||||
@ -1118,6 +1120,7 @@ CTL_RO_BOOL_CONFIG_GEN(config_debug)
|
|||||||
CTL_RO_BOOL_CONFIG_GEN(config_dss)
|
CTL_RO_BOOL_CONFIG_GEN(config_dss)
|
||||||
CTL_RO_BOOL_CONFIG_GEN(config_fill)
|
CTL_RO_BOOL_CONFIG_GEN(config_fill)
|
||||||
CTL_RO_BOOL_CONFIG_GEN(config_lazy_lock)
|
CTL_RO_BOOL_CONFIG_GEN(config_lazy_lock)
|
||||||
|
CTL_RO_BOOL_CONFIG_GEN(config_mremap)
|
||||||
CTL_RO_BOOL_CONFIG_GEN(config_munmap)
|
CTL_RO_BOOL_CONFIG_GEN(config_munmap)
|
||||||
CTL_RO_BOOL_CONFIG_GEN(config_prof)
|
CTL_RO_BOOL_CONFIG_GEN(config_prof)
|
||||||
CTL_RO_BOOL_CONFIG_GEN(config_prof_libgcc)
|
CTL_RO_BOOL_CONFIG_GEN(config_prof_libgcc)
|
||||||
|
@ -140,11 +140,11 @@ huge_ralloc(void *ptr, size_t oldsize, size_t size, size_t extra,
|
|||||||
*/
|
*/
|
||||||
copysize = (size < oldsize) ? size : oldsize;
|
copysize = (size < oldsize) ? size : oldsize;
|
||||||
|
|
||||||
|
#ifdef JEMALLOC_MREMAP
|
||||||
/*
|
/*
|
||||||
* Use mremap(2) if this is a huge-->huge reallocation, and neither the
|
* Use mremap(2) if this is a huge-->huge reallocation, and neither the
|
||||||
* source nor the destination are in dss.
|
* source nor the destination are in dss.
|
||||||
*/
|
*/
|
||||||
#ifdef JEMALLOC_MREMAP_FIXED
|
|
||||||
if (oldsize >= chunksize && (config_dss == false || (chunk_in_dss(ptr)
|
if (oldsize >= chunksize && (config_dss == false || (chunk_in_dss(ptr)
|
||||||
== false && chunk_in_dss(ret) == false))) {
|
== false && chunk_in_dss(ret) == false))) {
|
||||||
size_t newsize = huge_salloc(ret);
|
size_t newsize = huge_salloc(ret);
|
||||||
|
Loading…
Reference in New Issue
Block a user