Define MADV_FREE on our own when needed.

On x86 Linux, we define our own MADV_FREE if madvise(2) is available, but no
MADV_FREE is detected.  This allows the feature to be built in and enabled with
runtime detection.
This commit is contained in:
Qi Wang 2017-10-05 16:28:55 -07:00 committed by Qi Wang
parent fc83de0384
commit 31ab38be5f
4 changed files with 23 additions and 1 deletions

View File

@ -1824,6 +1824,15 @@ if test "x${je_cv_madvise}" = "xyes" ; then
], [je_cv_madv_free]) ], [je_cv_madv_free])
if test "x${je_cv_madv_free}" = "xyes" ; then if test "x${je_cv_madv_free}" = "xyes" ; then
AC_DEFINE([JEMALLOC_PURGE_MADVISE_FREE], [ ]) AC_DEFINE([JEMALLOC_PURGE_MADVISE_FREE], [ ])
elif test "x${je_cv_madvise}" = "xyes" ; then
case "${host_cpu}" in i686|x86_64)
case "${host}" in *-*-linux*)
AC_DEFINE([JEMALLOC_PURGE_MADVISE_FREE], [ ])
AC_DEFINE([JEMALLOC_DEFINE_MADVISE_FREE], [ ])
;;
esac
;;
esac
fi fi
dnl Check for madvise(..., MADV_DONTNEED). dnl Check for madvise(..., MADV_DONTNEED).

View File

@ -285,6 +285,9 @@
#undef JEMALLOC_PURGE_MADVISE_DONTNEED #undef JEMALLOC_PURGE_MADVISE_DONTNEED
#undef JEMALLOC_PURGE_MADVISE_DONTNEED_ZEROS #undef JEMALLOC_PURGE_MADVISE_DONTNEED_ZEROS
/* Defined if madvise(2) is available but MADV_FREE is not (x86 Linux only). */
#undef JEMALLOC_DEFINE_MADVISE_FREE
/* /*
* Defined if transparent huge pages (THPs) are supported via the * Defined if transparent huge pages (THPs) are supported via the
* MADV_[NO]HUGEPAGE arguments to madvise(2), and THP support is enabled. * MADV_[NO]HUGEPAGE arguments to madvise(2), and THP support is enabled.

View File

@ -47,6 +47,10 @@
#endif #endif
#include "jemalloc/internal/hooks.h" #include "jemalloc/internal/hooks.h"
#ifdef JEMALLOC_DEFINE_MADVISE_FREE
# define JEMALLOC_MADV_FREE 8
#endif
static const bool config_debug = static const bool config_debug =
#ifdef JEMALLOC_DEBUG #ifdef JEMALLOC_DEBUG
true true

View File

@ -269,7 +269,13 @@ pages_purge_lazy(void *addr, size_t size) {
VirtualAlloc(addr, size, MEM_RESET, PAGE_READWRITE); VirtualAlloc(addr, size, MEM_RESET, PAGE_READWRITE);
return false; return false;
#elif defined(JEMALLOC_PURGE_MADVISE_FREE) #elif defined(JEMALLOC_PURGE_MADVISE_FREE)
return (madvise(addr, size, MADV_FREE) != 0); return (madvise(addr, size,
# ifdef MADV_FREE
MADV_FREE
# else
JEMALLOC_MADV_FREE
# endif
) != 0);
#elif defined(JEMALLOC_PURGE_MADVISE_DONTNEED) && \ #elif defined(JEMALLOC_PURGE_MADVISE_DONTNEED) && \
!defined(JEMALLOC_PURGE_MADVISE_DONTNEED_ZEROS) !defined(JEMALLOC_PURGE_MADVISE_DONTNEED_ZEROS)
return (madvise(addr, size, MADV_DONTNEED) != 0); return (madvise(addr, size, MADV_DONTNEED) != 0);