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.
This commit is contained in:
David Goldblatt 2017-10-03 18:03:02 -07:00 committed by David Goldblatt
parent 7c6c99b829
commit 1245faae90
4 changed files with 18 additions and 6 deletions

View File

@ -381,6 +381,7 @@ dnl CPU-specific settings.
CPU_SPINWAIT="" CPU_SPINWAIT=""
case "${host_cpu}" in case "${host_cpu}" in
i686|x86_64) i686|x86_64)
HAVE_CPU_SPINWAIT=1
if test "x${je_cv_msvc}" = "xyes" ; then if test "x${je_cv_msvc}" = "xyes" ; then
AC_CACHE_VAL([je_cv_pause_msvc], AC_CACHE_VAL([je_cv_pause_msvc],
[JE_COMPILABLE([pause instruction MSVC], [], [JE_COMPILABLE([pause instruction MSVC], [],
@ -399,13 +400,11 @@ case "${host_cpu}" in
fi fi
fi fi
;; ;;
powerpc*)
AC_DEFINE_UNQUOTED([HAVE_ALTIVEC], [ ])
CPU_SPINWAIT='__asm__ volatile("or 31,31,31")'
;;
*) *)
HAVE_CPU_SPINWAIT=0
;; ;;
esac esac
AC_DEFINE_UNQUOTED([HAVE_CPU_SPINWAIT], [$HAVE_CPU_SPINWAIT])
AC_DEFINE_UNQUOTED([CPU_SPINWAIT], [$CPU_SPINWAIT]) AC_DEFINE_UNQUOTED([CPU_SPINWAIT], [$CPU_SPINWAIT])
case "${host_cpu}" in case "${host_cpu}" in

View File

@ -33,6 +33,8 @@
* order to yield to another virtual CPU. * order to yield to another virtual CPU.
*/ */
#undef CPU_SPINWAIT #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 * Number of significant bits in virtual addresses. This may be less than the

View File

@ -7,13 +7,23 @@ typedef struct {
unsigned iteration; unsigned iteration;
} spin_t; } 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 static inline void
spin_adaptive(spin_t *spin) { spin_adaptive(spin_t *spin) {
volatile uint32_t i; volatile uint32_t i;
if (spin->iteration < 5) { if (spin->iteration < 5) {
for (i = 0; i < (1U << spin->iteration); i++) { for (i = 0; i < (1U << spin->iteration); i++) {
CPU_SPINWAIT; spin_cpu_spinwait();
} }
spin->iteration++; spin->iteration++;
} else { } else {

View File

@ -4,6 +4,7 @@
#include "jemalloc/internal/assert.h" #include "jemalloc/internal/assert.h"
#include "jemalloc/internal/malloc_io.h" #include "jemalloc/internal/malloc_io.h"
#include "jemalloc/internal/spin.h"
#ifndef _CRT_SPINCOUNT #ifndef _CRT_SPINCOUNT
#define _CRT_SPINCOUNT 4000 #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; int cnt = 0, max_cnt = MALLOC_MUTEX_MAX_SPIN;
do { do {
CPU_SPINWAIT; spin_cpu_spinwait();
if (!malloc_mutex_trylock_final(mutex)) { if (!malloc_mutex_trylock_final(mutex)) {
data->n_spin_acquired++; data->n_spin_acquired++;
return; return;