Add experimental option force using SYS_process_madvise

This commit is contained in:
Slobodan Predolac 2025-04-25 18:26:49 -07:00 committed by Qi Wang
parent 1956a54a43
commit 852da1be15
3 changed files with 23 additions and 1 deletions

View file

@ -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=<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.

View file

@ -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

View file

@ -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;