diff --git a/configure.ac b/configure.ac index 1c9c5067..f731e8b4 100644 --- a/configure.ac +++ b/configure.ac @@ -2457,6 +2457,13 @@ if test "x${je_cv_osatomic}" = "xyes" ; then fi dnl ============================================================================ + +AC_ARG_WITH([experimental_sys_process_madvise], + [AS_HELP_STRING([--with-experimental-sys-process-madvise=], + [Force process_madvise and use experimental-sys-process-madvise number when making syscall])], + [je_cv_sys_pmadv_nr="${with_experimental_sys_process_madvise}"], + [je_cv_sys_pmadv_nr=""]) + dnl Check for madvise(2). JE_COMPILABLE([madvise(2)], [ @@ -2554,6 +2561,13 @@ if test "x${je_cv_madvise}" = "xyes" ; then ], [je_cv_process_madvise]) if test "x${je_cv_process_madvise}" = "xyes" ; then AC_DEFINE([JEMALLOC_HAVE_PROCESS_MADVISE], [ ], [ ]) + else + if test "x${je_cv_sys_pmadv_nr}" != "x" ; then + dnl Forcing experimental usage of process_madvise + AC_MSG_RESULT([Forcing usage of process_madvise with syscall nr=${je_cv_sys_pmadv_nr}]) + AC_DEFINE([JEMALLOC_HAVE_PROCESS_MADVISE], [ ], [ ]) + AC_DEFINE_UNQUOTED([EXPERIMENTAL_SYS_PROCESS_MADVISE_NR], [${je_cv_sys_pmadv_nr}], [ ]) + fi fi else dnl Check for posix_madvise. diff --git a/include/jemalloc/internal/jemalloc_internal_defs.h.in b/include/jemalloc/internal/jemalloc_internal_defs.h.in index 2e47438a..c7218c66 100644 --- a/include/jemalloc/internal/jemalloc_internal_defs.h.in +++ b/include/jemalloc/internal/jemalloc_internal_defs.h.in @@ -348,6 +348,8 @@ /* Defined if process_madvise(2) is available. */ #undef JEMALLOC_HAVE_PROCESS_MADVISE +#undef EXPERIMENTAL_SYS_PROCESS_MADVISE_NR + /* Defined if mprotect(2) is available. */ #undef JEMALLOC_HAVE_MPROTECT diff --git a/src/pages.c b/src/pages.c index babfd50f..d53e0fef 100644 --- a/src/pages.c +++ b/src/pages.c @@ -640,10 +640,16 @@ init_process_madvise(void) { return false; } +#ifdef SYS_process_madvise +#define JE_SYS_PROCESS_MADVISE_NR SYS_process_madvise +#else +#define JE_SYS_PROCESS_MADVISE_NR EXPERIMENTAL_SYS_PROCESS_MADVISE_NR +#endif + static bool pages_purge_process_madvise_impl(void *vec, size_t vec_len, size_t total_bytes) { - size_t purged_bytes = (size_t)syscall(SYS_process_madvise, pidfd, + size_t purged_bytes = (size_t)syscall(JE_SYS_PROCESS_MADVISE_NR, pidfd, (struct iovec *)vec, vec_len, MADV_DONTNEED, 0); return purged_bytes != total_bytes;