mirror of
git://sourceware.org/git/glibc.git
synced 2025-01-06 12:00:24 +08:00
47c5adebd2
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.
64 lines
2.1 KiB
C
64 lines
2.1 KiB
C
/* Set flags signalling availability of kernel features based on given
|
|
kernel version number.
|
|
Copyright (C) 1999-2014 Free Software Foundation, Inc.
|
|
This file is part of the GNU C Library.
|
|
|
|
The GNU C Library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Lesser General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2.1 of the License, or (at your option) any later version.
|
|
|
|
The GNU C Library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with the GNU C Library. If not, see
|
|
<http://www.gnu.org/licenses/>. */
|
|
|
|
#include <sgidefs.h>
|
|
|
|
/* MIPS platforms had IPC64 all along. */
|
|
#define __ASSUME_IPC64 1
|
|
|
|
/* MIPS had the utimes syscall by 2.6.0. */
|
|
#define __ASSUME_UTIMES 1
|
|
|
|
/* Support for the eventfd2 and signalfd4 syscalls was added in 2.6.27. */
|
|
#if __LINUX_KERNEL_VERSION >= 0x02061c
|
|
# define __ASSUME_EVENTFD2 1
|
|
# define __ASSUME_SIGNALFD4 1
|
|
#endif
|
|
|
|
/* Support for the accept4 syscall was added in 2.6.31. */
|
|
#if __LINUX_KERNEL_VERSION >= 0x02061f
|
|
# define __ASSUME_ACCEPT4_SYSCALL 1
|
|
#endif
|
|
|
|
/* Support for the recvmmsg syscall was added in 2.6.33. */
|
|
#if __LINUX_KERNEL_VERSION >= 0x020621
|
|
# define __ASSUME_RECVMMSG_SYSCALL 1
|
|
#endif
|
|
|
|
/* Support for the sendmmsg syscall was added in 3.1. */
|
|
#if __LINUX_KERNEL_VERSION >= 0x030100
|
|
# define __ASSUME_SENDMMSG_SYSCALL 1
|
|
#endif
|
|
|
|
#include_next <kernel-features.h>
|
|
|
|
/* The n32 syscall ABI did not have a getdents64 syscall until
|
|
2.6.35. */
|
|
#if _MIPS_SIM == _ABIN32 && __LINUX_KERNEL_VERSION < 0x020623
|
|
# undef __ASSUME_GETDENTS64_SYSCALL
|
|
#endif
|
|
|
|
/* The MIPS kernel does not support futex_atomic_cmpxchg_inatomic if
|
|
emulating LL/SC. */
|
|
#if __mips == 1 || defined _MIPS_ARCH_R5900
|
|
# undef __ASSUME_FUTEX_LOCK_PI
|
|
# undef __ASSUME_REQUEUE_PI
|
|
# undef __ASSUME_SET_ROBUST_LIST
|
|
#endif
|