From 706d9bf33aa2910fe7021cc68f954cdf2a9a7e12 Mon Sep 17 00:00:00 2001 From: Tom Callaway Date: Tue, 9 Jun 2015 17:43:35 -0400 Subject: [PATCH] fix modern futex handling --- gperftools-arm-has-futex.patch | 61 ++++++++++++++++++++++++++++++---- gperftools.spec | 6 +++- 2 files changed, 60 insertions(+), 7 deletions(-) diff --git a/gperftools-arm-has-futex.patch b/gperftools-arm-has-futex.patch index be22287..3ba7bbe 100644 --- a/gperftools-arm-has-futex.patch +++ b/gperftools-arm-has-futex.patch @@ -1,7 +1,32 @@ -diff -up gperftools-2.4/src/base/spinlock_linux-inl.h.armfutex gperftools-2.4/src/base/spinlock_linux-inl.h ---- gperftools-2.4/src/base/spinlock_linux-inl.h.armfutex 2015-06-01 15:46:32.129618825 -0400 -+++ gperftools-2.4/src/base/spinlock_linux-inl.h 2015-06-01 15:46:55.081459716 -0400 -@@ -51,13 +51,8 @@ static struct InitModule { +diff -ru gperftools-2.4/src/base/linux_syscall_support.h gperftools-2.4-fixed/src/base/linux_syscall_support.h +--- gperftools-2.4/src/base/linux_syscall_support.h 2014-12-06 23:51:40.000000000 +0100 ++++ gperftools-2.4-fixed/src/base/linux_syscall_support.h 2015-06-01 16:51:03.725616215 +0200 +@@ -83,7 +83,6 @@ + * sys_fcntl( + * sys_fstat( + * sys_futex( +- * sys_futex1( + * sys_getcpu( + * sys_getdents64( + * sys_getppid( +@@ -2094,9 +2093,11 @@ + int, c, long, a) + LSS_INLINE _syscall2(int, fstat, int, f, + struct kernel_stat*, b) +- LSS_INLINE _syscall4(int, futex, int*, a, ++ LSS_INLINE _syscall6(int, futex, int*, a, + int, o, int, v, +- struct kernel_timespec*, t) ++ struct kernel_timespec*, t, ++ int*, a2, ++ int, v3) + #ifdef __NR_getdents64 + LSS_INLINE _syscall3(int, getdents64, int, f, + struct kernel_dirent64*, d, int, c) +diff -ru gperftools-2.4/src/base/spinlock_linux-inl.h gperftools-2.4-fixed/src/base/spinlock_linux-inl.h +--- gperftools-2.4/src/base/spinlock_linux-inl.h 2014-12-06 23:51:40.000000000 +0100 ++++ gperftools-2.4-fixed/src/base/spinlock_linux-inl.h 2015-06-01 16:51:03.725616215 +0200 +@@ -51,15 +51,10 @@ int x = 0; // futexes are ints, so we can use them only when // that's the same size as the lockword_ in SpinLock. @@ -10,8 +35,32 @@ diff -up gperftools-2.4/src/base/spinlock_linux-inl.h.armfutex gperftools-2.4/sr - have_futex = 0; -#else have_futex = (sizeof (Atomic32) == sizeof (int) && - sys_futex(&x, FUTEX_WAKE, 1, 0) >= 0); +- sys_futex(&x, FUTEX_WAKE, 1, 0) >= 0); -#endif ++ sys_futex(&x, FUTEX_WAKE, 1, NULL, NULL, 0) >= 0); if (have_futex && - sys_futex(&x, FUTEX_WAKE | futex_private_flag, 1, 0) < 0) { +- sys_futex(&x, FUTEX_WAKE | futex_private_flag, 1, 0) < 0) { ++ sys_futex(&x, FUTEX_WAKE | futex_private_flag, 1, NULL, NULL, 0) < 0) { futex_private_flag = 0; + } + } +@@ -85,7 +85,8 @@ + tm.tv_nsec *= 16; // increase the delay; we expect explicit wakeups + sys_futex(reinterpret_cast(const_cast(w)), + FUTEX_WAIT | futex_private_flag, +- value, reinterpret_cast(&tm)); ++ value, reinterpret_cast(&tm), ++ NULL, 0); + } else { + nanosleep(&tm, NULL); + } +@@ -96,7 +97,8 @@ + void SpinLockWake(volatile Atomic32 *w, bool all) { + if (have_futex) { + sys_futex(reinterpret_cast(const_cast(w)), +- FUTEX_WAKE | futex_private_flag, all? INT_MAX : 1, 0); ++ FUTEX_WAKE | futex_private_flag, all? INT_MAX : 1, ++ NULL, NULL, 0); + } + } + diff --git a/gperftools.spec b/gperftools.spec index 26f4add..c30098c 100644 --- a/gperftools.spec +++ b/gperftools.spec @@ -4,12 +4,13 @@ Name: gperftools Version: 2.4 -Release: 3%{?dist} +Release: 4%{?dist} License: BSD Group: Development/Tools Summary: Very fast malloc and performance analysis tools URL: http://code.google.com/p/gperftools/ Source0: https://googledrive.com/host/0B6NtGsLhIcf7MWxMMF9JdTN3UVk/%{name}-%{version}.tar.gz +# https://code.google.com/p/gperftools/issues/detail?id=693 Patch0: gperftools-arm-has-futex.patch ExcludeArch: s390 s390x %ifnarch ppc %{power64} @@ -110,6 +111,9 @@ rm -rf %{buildroot}%{_pkgdocdir}/INSTALL %{_libdir}/*.so.* %changelog +* Tue Jun 9 2015 Tom Callaway - 2.4-4 +- fix modern futex handling (thanks to Paolo Bonzini) + * Mon Jun 1 2015 Tom Callaway - 2.4-3 - enable futex for ARM