glibc/sysdeps
Joseph Myers 47c5adebd2 Correct robust mutex / PI futex kernel assumptions (bug 9894).
This patch continues fixing __ASSUME_* issues in preparation for
moving to a 2.6.32 minimum kernel version by addressing assumptions on
robust mutex and PI futex support availability.  Those assumptions are
bug 9894, but to be clear this patch does not address all the issues
from that bug about wrong version assumptions, only those still
applicable for --enable-kernel=2.6.32 or later (with the expectation
that the move to that minimum kernel will obsolete the other parts of
the bug).  The patch is independent of
<https://sourceware.org/ml/libc-alpha/2014-03/msg00585.html>, my other
pending-review patch preparing for the kernel version change; the two
together complete all the changes I believe are needed in preparation
regarding any macro in sysdeps/unix/sysv/linux/kernel-features.h that
would be affected by such a change.  (I have not checked the
correctness of macros whose conditions are unaffected by such a
change, or macros only defined in other kernel-features.h files.)

As discussed in that bug, robust mutexes and PI futexes need
futex_atomic_cmpxchg_inatomic to be implemented, in addition to
certain syscalls needed for robust mutexes (and
architecture-independent kernel pieces for all the features in
question).  That is, as I understand it, they need
futex_atomic_cmpxchg_inatomic to *work* (not return an ENOSYS error).

The issues identified in my analysis relate to ARM, M68K, MicroBlaze,
MIPS and SPARC.

On ARM, whether futex_atomic_cmpxchg_inatomic works depends on the
kernel configuration.  As of 3.13, the condition for *not* working is
CONFIG_CPU_USE_DOMAINS && CONFIG_SMP.  As of 2.6.32 it was simply
CONFIG_SMP that meant the feature was not implemented.  I don't know
if there are any circumstances in which we can say "we can assume a
userspace glibc binary built with these options will never run on a
kernel with the problematic configuration", but at least for now I'm
just undefining the relevant __ASSUME_* macros for ARM.

On M68K, two of the three macros are undefined for kernels before
3.10, but as far as I can see __ASSUME_FUTEX_LOCK_PI is in the same
group needing futex_atomic_cmpxchg_inatomic support and so should be
undefined as well.

On MicroBlaze the required support was added in 2.6.33.

On MIPS, the support depends on cpu_has_llsc in the kernel - that is,
actual hardware LL/SC support (GCC and glibc for MIPS GNU/Linux rely
on the instructions being supported in some way, but it may be kernel
emulation; futex_atomic_cmpxchg_inatomic doesn't work with that
emulation).  The same condition as in GCC for indicating LL/SC support
may not be available is used for undefining the macros in glibc,
__mips == 1 || defined _MIPS_ARCH_R5900.  (Maybe we could in fact
desupport MIPS processors without the hardware support in glibc.)

On SPARC, 32-bit kernels don't support futex_atomic_cmpxchg_inatomic;
__arch64__ || __sparc_v9__ is used as the condition for binaries that
won't run on 32-bit kernels.

This patch is not tested beyond the sanity check of an x86_64 build.

	[BZ #9894]
	* sysdeps/unix/sysv/linux/kernel-features.h
	[__sparc__ && !__arch64__ && !__sparc_v9__]
	(__ASSUME_SET_ROBUST_LIST): Do not define.
	[__sparc__ && !__arch64__ && !__sparc_v9__]
	(__ASSUME_FUTEX_LOCK_PI): Likewise.
	[__sparc__ && !__arch64__ && !__sparc_v9__] (__ASSUME_REQUEUE_PI):
	Likewise.
	* sysdeps/unix/sysv/linux/arm/kernel-features.h
	(__ASSUME_FUTEX_LOCK_PI): Undefine.
	(__ASSUME_REQUEUE_PI): Likewise.
	(__ASSUME_SET_ROBUST_LIST): Likewise.
	* sysdeps/unix/sysv/linux/m68k/kernel-features.h
	[__LINUX_KERNEL_VERSION < 0x030a00] (__ASSUME_FUTEX_LOCK_PI):
	Undefine.
	* sysdeps/unix/sysv/linux/microblaze/kernel-features.h
	[__LINUX_KERNEL_VERSION < 0x020621] (__ASSUME_FUTEX_LOCK_PI):
	Likewise.
	[__LINUX_KERNEL_VERSION < 0x020621] (__ASSUME_REQUEUE_PI):
	Likewise.
	[__LINUX_KERNEL_VERSION < 0x020621] (__ASSUME_SET_ROBUST_LIST):
	Likewise.
	* sysdeps/unix/sysv/linux/mips/kernel-features.h
	[__mips == 1 || _MIPS_ARCH_R5900] (__ASSUME_FUTEX_LOCK_PI):
	Undefine.
	[__mips == 1 || _MIPS_ARCH_R5900] (__ASSUME_REQUEUE_PI): Likewise.
	[__mips == 1 || _MIPS_ARCH_R5900] (__ASSUME_SET_ROBUST_LIST):
	Likewise.
2014-03-31 12:55:18 +00:00
..
aarch64 Compile with -Wundef. 2014-03-14 11:32:51 -07:00
alpha Compile with -Wundef. 2014-03-14 11:32:51 -07:00
arm Fix -Wundef warnins for __FP_FAST_FMA* 2014-03-21 17:28:43 +05:30
generic S390: Define SIZE_MAX as unsigned long (BZ #16712). 2014-03-24 16:59:01 +01:00
gnu Combine __USE_BSD and __USE_SVID into __USE_MISC. 2014-02-12 23:41:01 +00:00
i386 Fix x86/x86_64 expl/exp10l spurious underflows (bug 16348). 2014-03-27 18:41:14 +00:00
ia64 Compile with -Wundef. 2014-03-14 11:32:51 -07:00
ieee754 Fix implicit __isinf declarations in exp. 2014-03-24 22:00:32 +00:00
init_array Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
m68k Compile with -Wundef. 2014-03-14 11:32:51 -07:00
mach Compile with -Wundef. 2014-03-14 11:32:51 -07:00
microblaze Compile with -Wundef. 2014-03-14 11:32:51 -07:00
mips Fix -Wundef warnings for _ABI* on MIPS. 2014-03-21 18:21:13 +00:00
posix Fix use of half-initialized result in getaddrinfo when using nscd (bug 16743) 2014-03-24 16:51:53 +01:00
powerpc Update powerpc-fpu ULPs. 2014-03-25 10:13:53 -05:00
pthread Use glibc_likely instead __builtin_expect. 2014-02-10 15:07:12 +01:00
s390 S390: Define SIZE_MAX as unsigned long (BZ #16712). 2014-03-24 16:59:01 +01:00
sh Don't include individual test ulps in libm-test-ulps. 2014-03-05 15:02:38 +00:00
sparc Don't include individual test ulps in libm-test-ulps. 2014-03-05 15:02:38 +00:00
tile Fix -Wundef warnins for __FP_FAST_FMA* 2014-03-21 17:28:43 +05:30
unix Correct robust mutex / PI futex kernel assumptions (bug 9894). 2014-03-31 12:55:18 +00:00
wordsize-32 Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
wordsize-64 Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
x86 Fix -Wundef warnins for __FP_FAST_FMA* 2014-03-21 17:28:43 +05:30
x86_64 Fix x86/x86_64 expl/exp10l spurious underflows (bug 16348). 2014-03-27 18:41:14 +00:00