Correct robust mutex / PI futex kernel assumptions (bug 9894)
Commit Message
On Tue, 25 Mar 2014, David Miller wrote:
> From: "Joseph S. Myers" <joseph@codesourcery.com>
> Date: Tue, 25 Mar 2014 23:20:00 +0000
>
> > On Tue, 25 Mar 2014, David Miller wrote:
> >
> >> Actually, it turns out you can simply test for the CPP macro __sparc_v9__
> >
> > In that case, here is a revised patch using __sparc_v9__ in place of
> > __arch64__.
>
> It only get's set for 32-bit v9, you'll need to keep the
> (__sparc__ && __arch64__) in an "||" conditional branch.
>
> Something like (__sparc__ && (__arch64__ || __sparc_v9__))
Here's a third patch version.
2014-03-25 Joseph Myers <joseph@codesourcery.com>
[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.
Comments
From: "Joseph S. Myers" <joseph@codesourcery.com>
Date: Tue, 25 Mar 2014 23:36:36 +0000
> On Tue, 25 Mar 2014, David Miller wrote:
>
>> From: "Joseph S. Myers" <joseph@codesourcery.com>
>> Date: Tue, 25 Mar 2014 23:20:00 +0000
>>
>> > On Tue, 25 Mar 2014, David Miller wrote:
>> >
>> >> Actually, it turns out you can simply test for the CPP macro __sparc_v9__
>> >
>> > In that case, here is a revised patch using __sparc_v9__ in place of
>> > __arch64__.
>>
>> It only get's set for 32-bit v9, you'll need to keep the
>> (__sparc__ && __arch64__) in an "||" conditional branch.
>>
>> Something like (__sparc__ && (__arch64__ || __sparc_v9__))
>
> Here's a third patch version.
Looks good to me.
> -----Original Message-----
> From: David Miller [mailto:davem@davemloft.net]
> Sent: Wednesday, 26 March 2014 10:21 am
> To: joseph@codesourcery.com
> Cc: libc-alpha@sourceware.org; schwab@linux-m68k.org; David Holsgrove;
> aurel32@debian.org
> Subject: Re: Correct robust mutex / PI futex kernel assumptions (bug 9894)
>
> From: "Joseph S. Myers" <joseph@codesourcery.com>
> Date: Tue, 25 Mar 2014 23:36:36 +0000
>
> > On Tue, 25 Mar 2014, David Miller wrote:
> >
> >> From: "Joseph S. Myers" <joseph@codesourcery.com>
> >> Date: Tue, 25 Mar 2014 23:20:00 +0000
> >>
> >> > On Tue, 25 Mar 2014, David Miller wrote:
> >> >
> >> >> Actually, it turns out you can simply test for the CPP macro __sparc_v9__
> >> >
> >> > In that case, here is a revised patch using __sparc_v9__ in place of
> >> > __arch64__.
> >>
> >> It only get's set for 32-bit v9, you'll need to keep the
> >> (__sparc__ && __arch64__) in an "||" conditional branch.
> >>
> >> Something like (__sparc__ && (__arch64__ || __sparc_v9__))
> >
> > Here's a third patch version.
>
> Looks good to me.
Good for MicroBlaze too - thanks Joseph,
David
@@ -53,3 +53,10 @@
# undef __ASSUME_PSELECT
# undef __ASSUME_PPOLL
#endif
+
+/* The ARM kernel may or may not support
+ futex_atomic_cmpxchg_inatomic, depending on kernel
+ configuration. */
+#undef __ASSUME_FUTEX_LOCK_PI
+#undef __ASSUME_REQUEUE_PI
+#undef __ASSUME_SET_ROBUST_LIST
@@ -106,9 +106,12 @@
# define __ASSUME_ATFCTS 1
#endif
-/* Support for inter-process robust mutexes was added in 2.6.17. */
+/* Support for inter-process robust mutexes was added in 2.6.17 (but
+ some architectures lack futex_atomic_cmpxchg_inatomic in some
+ configurations). */
#if __LINUX_KERNEL_VERSION >= 0x020611 \
- && (!defined __sh__ || __LINUX_KERNEL_VERSION >= 0x020613)
+ && (!defined __sh__ || __LINUX_KERNEL_VERSION >= 0x020613) \
+ && !(defined __sparc__ && !defined __arch64__ && !defined __sparc_v9__)
# define __ASSUME_SET_ROBUST_LIST 1
#endif
@@ -119,8 +122,10 @@
# define __ASSUME_COMPLETE_READV_WRITEV 1
#endif
-/* Support for PI futexes was added in 2.6.18. */
-#if __LINUX_KERNEL_VERSION >= 0x020612
+/* Support for PI futexes was added in 2.6.18 (but some architectures
+ lack futex_atomic_cmpxchg_inatomic in some configurations). */
+#if __LINUX_KERNEL_VERSION >= 0x020612 \
+ && !(defined __sparc__ && !defined __arch64__ && !defined __sparc_v9__)
# define __ASSUME_FUTEX_LOCK_PI 1
#endif
@@ -223,8 +228,11 @@
# define __ASSUME_PWRITEV 1
#endif
-/* Support for FUTEX_*_REQUEUE_PI was added in 2.6.31. */
-#if __LINUX_KERNEL_VERSION >= 0x02061f
+/* Support for FUTEX_*_REQUEUE_PI was added in 2.6.31 (but some
+ architectures lack futex_atomic_cmpxchg_inatomic in some
+ configurations). */
+#if __LINUX_KERNEL_VERSION >= 0x02061f \
+ && !(defined __sparc__ && !defined __arch64__ && !defined __sparc_v9__)
# define __ASSUME_REQUEUE_PI 1
#endif
@@ -48,6 +48,7 @@
/* No support for PI futexes or robust mutexes before 3.10 for m68k. */
#if __LINUX_KERNEL_VERSION < 0x030a00
+# undef __ASSUME_FUTEX_LOCK_PI
# undef __ASSUME_REQUEUE_PI
# undef __ASSUME_SET_ROBUST_LIST
#endif
@@ -43,6 +43,13 @@
#include_next <kernel-features.h>
+/* Support for futex_atomic_cmpxchg_inatomic was added in 2.6.33. */
+#if __LINUX_KERNEL_VERSION < 0x020621
+# undef __ASSUME_FUTEX_LOCK_PI
+# undef __ASSUME_REQUEUE_PI
+# undef __ASSUME_SET_ROBUST_LIST
+#endif
+
/* The MicroBlaze kernel does not support the pselect6, preadv and
pwritev syscalls. */
#undef __ASSUME_PSELECT
@@ -53,3 +53,11 @@
#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