aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Goldblatt <davidgoldblatt@fb.com>2017-10-03 18:03:02 -0700
committerDavid Goldblatt <davidtgoldblatt@gmail.com>2017-10-04 18:37:23 -0700
commit1245faae9052350a96dbcb22de7979bca566dbec (patch)
tree19043580b26ec4953bab4435e44206d71e7db697
parent7c6c99b8295829580c506067495a23c07436e266 (diff)
downloadplatform_external_jemalloc_new-1245faae9052350a96dbcb22de7979bca566dbec.tar.gz
platform_external_jemalloc_new-1245faae9052350a96dbcb22de7979bca566dbec.tar.bz2
platform_external_jemalloc_new-1245faae9052350a96dbcb22de7979bca566dbec.zip
Power: disable the CPU_SPINWAIT macro.
Quoting from https://github.com/jemalloc/jemalloc/issues/761 : [...] reading the Power ISA documentation[1], the assembly in [the CPU_SPINWAIT macro] isn't correct anyway (as @marxin points out): the setting of the program-priority register is "sticky", and we never undo the lowering. We could do something similar, but given that we don't have testing here in the first place, I'm inclined to simply not try. I'll put something up reverting the problematic commit tomorrow. [1] Book II, chapter 3 of the 2.07B or 3.0B ISA documents.
-rw-r--r--configure.ac7
-rw-r--r--include/jemalloc/internal/jemalloc_internal_defs.h.in2
-rw-r--r--include/jemalloc/internal/spin.h12
-rw-r--r--src/mutex.c3
4 files changed, 18 insertions, 6 deletions
diff --git a/configure.ac b/configure.ac
index ab2f41ae..f957377b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -381,6 +381,7 @@ dnl CPU-specific settings.
CPU_SPINWAIT=""
case "${host_cpu}" in
i686|x86_64)
+ HAVE_CPU_SPINWAIT=1
if test "x${je_cv_msvc}" = "xyes" ; then
AC_CACHE_VAL([je_cv_pause_msvc],
[JE_COMPILABLE([pause instruction MSVC], [],
@@ -399,13 +400,11 @@ case "${host_cpu}" in
fi
fi
;;
- powerpc*)
- AC_DEFINE_UNQUOTED([HAVE_ALTIVEC], [ ])
- CPU_SPINWAIT='__asm__ volatile("or 31,31,31")'
- ;;
*)
+ HAVE_CPU_SPINWAIT=0
;;
esac
+AC_DEFINE_UNQUOTED([HAVE_CPU_SPINWAIT], [$HAVE_CPU_SPINWAIT])
AC_DEFINE_UNQUOTED([CPU_SPINWAIT], [$CPU_SPINWAIT])
case "${host_cpu}" in
diff --git a/include/jemalloc/internal/jemalloc_internal_defs.h.in b/include/jemalloc/internal/jemalloc_internal_defs.h.in
index 5fa7f51f..31262fb2 100644
--- a/include/jemalloc/internal/jemalloc_internal_defs.h.in
+++ b/include/jemalloc/internal/jemalloc_internal_defs.h.in
@@ -33,6 +33,8 @@
* order to yield to another virtual CPU.
*/
#undef CPU_SPINWAIT
+/* 1 if CPU_SPINWAIT is defined, 0 otherwise. */
+#undef HAVE_CPU_SPINWAIT
/*
* Number of significant bits in virtual addresses. This may be less than the
diff --git a/include/jemalloc/internal/spin.h b/include/jemalloc/internal/spin.h
index aded0fcc..22804c68 100644
--- a/include/jemalloc/internal/spin.h
+++ b/include/jemalloc/internal/spin.h
@@ -8,12 +8,22 @@ typedef struct {
} spin_t;
static inline void
+spin_cpu_spinwait() {
+# if HAVE_CPU_SPINWAIT
+ CPU_SPINWAIT;
+# else
+ volatile int x = 0;
+ x = x;
+# endif
+}
+
+static inline void
spin_adaptive(spin_t *spin) {
volatile uint32_t i;
if (spin->iteration < 5) {
for (i = 0; i < (1U << spin->iteration); i++) {
- CPU_SPINWAIT;
+ spin_cpu_spinwait();
}
spin->iteration++;
} else {
diff --git a/src/mutex.c b/src/mutex.c
index a528ef0c..3de7f44a 100644
--- a/src/mutex.c
+++ b/src/mutex.c
@@ -4,6 +4,7 @@
#include "jemalloc/internal/assert.h"
#include "jemalloc/internal/malloc_io.h"
+#include "jemalloc/internal/spin.h"
#ifndef _CRT_SPINCOUNT
#define _CRT_SPINCOUNT 4000
@@ -53,7 +54,7 @@ malloc_mutex_lock_slow(malloc_mutex_t *mutex) {
int cnt = 0, max_cnt = MALLOC_MUTEX_MAX_SPIN;
do {
- CPU_SPINWAIT;
+ spin_cpu_spinwait();
if (!malloc_mutex_trylock_final(mutex)) {
data->n_spin_acquired++;
return;