From df8f7d10af15d549ab73ba807b2e14a9d7fe1cc2 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Fri, 20 May 2022 20:14:33 +0100 Subject: [PATCH] Implement malloc_getcpu for amd64 and arm64 macOS This enables per CPU arena on MacOS --- configure.ac | 17 +++++++++++++++++ .../internal/jemalloc_internal_inlines_a.h | 9 +++++++++ 2 files changed, 26 insertions(+) diff --git a/configure.ac b/configure.ac index 8248f52d..66eb7c91 100644 --- a/configure.ac +++ b/configure.ac @@ -510,6 +510,23 @@ typedef unsigned __int32 uint32_t; else AC_MSG_ERROR([cannot determine number of significant virtual address bits]) fi + AC_CACHE_CHECK([rdtscp support], + [je_cv_rdtscp], + AC_RUN_IFELSE([AC_LANG_PROGRAM( +[[ +#include +]], +[[ + unsigned int dx; + asm volatile("rdtscp" : "=d"(dx) ::); + return 0; +]])], + [je_cv_rdtscp=yes], + [je_cv_rdstcp=no], + [je_cv_rdtscp=no])) + if test "x${je_cv_rdtscp}" = "xyes"; then + AC_DEFINE([HAVE_RDTSCP], 1, []) + fi fi ;; *) diff --git a/include/jemalloc/internal/jemalloc_internal_inlines_a.h b/include/jemalloc/internal/jemalloc_internal_inlines_a.h index 9e27cc30..7686a9b7 100644 --- a/include/jemalloc/internal/jemalloc_internal_inlines_a.h +++ b/include/jemalloc/internal/jemalloc_internal_inlines_a.h @@ -14,6 +14,15 @@ malloc_getcpu(void) { return GetCurrentProcessorNumber(); #elif defined(JEMALLOC_HAVE_SCHED_GETCPU) return (malloc_cpuid_t)sched_getcpu(); +#elif defined(HAVE_RDTSCP) + unsigned int ax, cx, dx; + asm volatile("rdtscp" : "=a"(ax), "=d"(dx), "=c"(cx) ::); + return (malloc_cpuid_t)(dx & 0xfff); +#elif defined(__aarch64__) && defined(__APPLE__) + /* Other oses most likely use tpidr_el0 instead */ + uintptr_t c; + asm volatile("mrs %x0, tpidrro_el0" : "=r"(c) :: "memory"); + return (malloc_cpuid_t)(c & (1 << 3) - 1); #else not_reached(); return -1;