[1/3] Remove __ASSUME_FUTEX_LOCK_PI
Commit Message
This patch removes __ASSUME_FUTEX_LOCK_PI usage and assumes that
kernel will correctly return if it supports or not
futex_atomic_cmpxchg_inatomic.
Current PI mutex code already has runtime support by calling
prio_inherit_missing and returns ENOTSUP if the futex operation fails
at initialization (it issues a FUTEX_UNLOCK_PI futex operation).
Also, current minimum supported kernel (v3.2) will return ENOSYS if
futex_atomic_cmpxchg_inatomic is not supported in the system:
kernel/futex.c:
2628 long do_futex(u32 __user *uaddr, int op, u32 val, ktime_t *timeout,
2629 u32 __user *uaddr2, u32 val2, u32 val3)
2630 {
2631 int ret = -ENOSYS, cmd = op & FUTEX_CMD_MASK;
[...]
2667 case FUTEX_UNLOCK_PI:
2668 if (futex_cmpxchg_enabled)
2669 ret = futex_unlock_pi(uaddr, flags);
[...]
2686 return ret;
2687 }
The futex_cmpxchg_enabled is initialized by calling cmpxchg_futex_value_locked,
which calls futex_atomic_cmpxchg_inatomic.
For ARM futex_atomic_cmpxchg_inatomic will be either defined (if both
CONFIG_CPU_USE_DOMAINS and CONFIG_SMP are not defined) or use the
default generic implementation that returns ENOSYS.
For m68k is uses the default generic implementation.
For mips futex_atomic_cmpxchg_inatomic will return ENOSYS if cpu has no
'cpu_has_llsc' support (defined by each chip supporte inside kernel).
For sparc, 32-bit kernel will just use default generic implementation,
while 64-bit kernel has support.
Tested on ARM (v3.8 kernel) and x86_64.
* nptl/pthread_mutex_init.c [__ASSUME_FUTEX_LOCK_PI]
(prio_inherit_missing): Remove define.
* sysdeps/unix/sysv/linux/arm/kernel-features.h
(__ASSUME_FUTEX_LOCK_PI): Likewise.
* sysdeps/unix/sysv/linux/kernel-features.h (__ASSUME_FUTEX_LOCK_PI):
Likewise.
* sysdeps/unix/sysv/linux/m68k/kernel-features.h
(__ASSUME_FUTEX_LOCK_PI): Likewise.
* sysdeps/unix/sysv/linux/mips/kernel-features.h
(__ASSUME_FUTEX_LOCK_PI): Likewise.
* sysdeps/unix/sysv/linux/sparc/kernel-features.h
(__ASSUME_FUTEX_LOCK_PI): Likewise.
---
ChangeLog | 15 +++++++++++++++
nptl/pthread_mutex_init.c | 3 ---
sysdeps/unix/sysv/linux/arm/kernel-features.h | 1 -
sysdeps/unix/sysv/linux/kernel-features.h | 4 ----
sysdeps/unix/sysv/linux/m68k/kernel-features.h | 1 -
sysdeps/unix/sysv/linux/mips/kernel-features.h | 1 -
sysdeps/unix/sysv/linux/sparc/kernel-features.h | 1 -
7 files changed, 15 insertions(+), 11 deletions(-)
Comments
Ping.
On 18/05/2016 18:57, Adhemerval Zanella wrote:
> This patch removes __ASSUME_FUTEX_LOCK_PI usage and assumes that
> kernel will correctly return if it supports or not
> futex_atomic_cmpxchg_inatomic.
>
> Current PI mutex code already has runtime support by calling
> prio_inherit_missing and returns ENOTSUP if the futex operation fails
> at initialization (it issues a FUTEX_UNLOCK_PI futex operation).
>
> Also, current minimum supported kernel (v3.2) will return ENOSYS if
> futex_atomic_cmpxchg_inatomic is not supported in the system:
>
> kernel/futex.c:
>
> 2628 long do_futex(u32 __user *uaddr, int op, u32 val, ktime_t *timeout,
> 2629 u32 __user *uaddr2, u32 val2, u32 val3)
> 2630 {
> 2631 int ret = -ENOSYS, cmd = op & FUTEX_CMD_MASK;
> [...]
> 2667 case FUTEX_UNLOCK_PI:
> 2668 if (futex_cmpxchg_enabled)
> 2669 ret = futex_unlock_pi(uaddr, flags);
> [...]
> 2686 return ret;
> 2687 }
>
> The futex_cmpxchg_enabled is initialized by calling cmpxchg_futex_value_locked,
> which calls futex_atomic_cmpxchg_inatomic.
>
> For ARM futex_atomic_cmpxchg_inatomic will be either defined (if both
> CONFIG_CPU_USE_DOMAINS and CONFIG_SMP are not defined) or use the
> default generic implementation that returns ENOSYS.
>
> For m68k is uses the default generic implementation.
>
> For mips futex_atomic_cmpxchg_inatomic will return ENOSYS if cpu has no
> 'cpu_has_llsc' support (defined by each chip supporte inside kernel).
>
> For sparc, 32-bit kernel will just use default generic implementation,
> while 64-bit kernel has support.
>
> Tested on ARM (v3.8 kernel) and x86_64.
>
> * nptl/pthread_mutex_init.c [__ASSUME_FUTEX_LOCK_PI]
> (prio_inherit_missing): Remove define.
> * sysdeps/unix/sysv/linux/arm/kernel-features.h
> (__ASSUME_FUTEX_LOCK_PI): Likewise.
> * sysdeps/unix/sysv/linux/kernel-features.h (__ASSUME_FUTEX_LOCK_PI):
> Likewise.
> * sysdeps/unix/sysv/linux/m68k/kernel-features.h
> (__ASSUME_FUTEX_LOCK_PI): Likewise.
> * sysdeps/unix/sysv/linux/mips/kernel-features.h
> (__ASSUME_FUTEX_LOCK_PI): Likewise.
> * sysdeps/unix/sysv/linux/sparc/kernel-features.h
> (__ASSUME_FUTEX_LOCK_PI): Likewise.
> ---
> ChangeLog | 15 +++++++++++++++
> nptl/pthread_mutex_init.c | 3 ---
> sysdeps/unix/sysv/linux/arm/kernel-features.h | 1 -
> sysdeps/unix/sysv/linux/kernel-features.h | 4 ----
> sysdeps/unix/sysv/linux/m68k/kernel-features.h | 1 -
> sysdeps/unix/sysv/linux/mips/kernel-features.h | 1 -
> sysdeps/unix/sysv/linux/sparc/kernel-features.h | 1 -
> 7 files changed, 15 insertions(+), 11 deletions(-)
>
> diff --git a/nptl/pthread_mutex_init.c b/nptl/pthread_mutex_init.c
> index 71ac7bc..6e5acb6 100644
> --- a/nptl/pthread_mutex_init.c
> +++ b/nptl/pthread_mutex_init.c
> @@ -37,7 +37,6 @@ static bool
> prio_inherit_missing (void)
> {
> #ifdef __NR_futex
> -# ifndef __ASSUME_FUTEX_LOCK_PI
> static int tpi_supported;
> if (__glibc_unlikely (tpi_supported == 0))
> {
> @@ -48,8 +47,6 @@ prio_inherit_missing (void)
> tpi_supported = INTERNAL_SYSCALL_ERRNO (ret, err) == ENOSYS ? -1 : 1;
> }
> return __glibc_unlikely (tpi_supported < 0);
> -# endif
> - return false;
> #endif
> return true;
> }
> diff --git a/sysdeps/unix/sysv/linux/arm/kernel-features.h b/sysdeps/unix/sysv/linux/arm/kernel-features.h
> index 0a9ed77..6ca607e 100644
> --- a/sysdeps/unix/sysv/linux/arm/kernel-features.h
> +++ b/sysdeps/unix/sysv/linux/arm/kernel-features.h
> @@ -23,7 +23,6 @@
> futex_atomic_cmpxchg_inatomic, depending on kernel
> configuration. */
> #if __LINUX_KERNEL_VERSION < 0x030E03
> -# undef __ASSUME_FUTEX_LOCK_PI
> # undef __ASSUME_REQUEUE_PI
> # undef __ASSUME_SET_ROBUST_LIST
> #endif
> diff --git a/sysdeps/unix/sysv/linux/kernel-features.h b/sysdeps/unix/sysv/linux/kernel-features.h
> index 5a1b204..43b72b1 100644
> --- a/sysdeps/unix/sysv/linux/kernel-features.h
> +++ b/sysdeps/unix/sysv/linux/kernel-features.h
> @@ -64,10 +64,6 @@
> configurations). */
> #define __ASSUME_SET_ROBUST_LIST 1
>
> -/* Support for PI futexes was added in 2.6.18 (but some architectures
> - lack futex_atomic_cmpxchg_inatomic in some configurations). */
> -#define __ASSUME_FUTEX_LOCK_PI 1
> -
> /* Support for private futexes was added in 2.6.22. */
> #define __ASSUME_PRIVATE_FUTEX 1
>
> diff --git a/sysdeps/unix/sysv/linux/m68k/kernel-features.h b/sysdeps/unix/sysv/linux/m68k/kernel-features.h
> index 646bc4b..9e7f0e1 100644
> --- a/sysdeps/unix/sysv/linux/m68k/kernel-features.h
> +++ b/sysdeps/unix/sysv/linux/m68k/kernel-features.h
> @@ -51,7 +51,6 @@
>
> /* 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
> diff --git a/sysdeps/unix/sysv/linux/mips/kernel-features.h b/sysdeps/unix/sysv/linux/mips/kernel-features.h
> index e831645..09d5ece 100644
> --- a/sysdeps/unix/sysv/linux/mips/kernel-features.h
> +++ b/sysdeps/unix/sysv/linux/mips/kernel-features.h
> @@ -24,7 +24,6 @@
> /* 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
> diff --git a/sysdeps/unix/sysv/linux/sparc/kernel-features.h b/sysdeps/unix/sysv/linux/sparc/kernel-features.h
> index 386f230..69c9c7c 100644
> --- a/sysdeps/unix/sysv/linux/sparc/kernel-features.h
> +++ b/sysdeps/unix/sysv/linux/sparc/kernel-features.h
> @@ -34,7 +34,6 @@
> /* 32-bit SPARC kernels do not support
> futex_atomic_cmpxchg_inatomic. */
> #if !defined __arch64__ && !defined __sparc_v9__
> -# undef __ASSUME_FUTEX_LOCK_PI
> # undef __ASSUME_REQUEUE_PI
> # undef __ASSUME_SET_ROBUST_LIST
> #endif
>
Ping.
On 24/05/2016 16:07, Adhemerval Zanella wrote:
> Ping.
>
> On 18/05/2016 18:57, Adhemerval Zanella wrote:
>> This patch removes __ASSUME_FUTEX_LOCK_PI usage and assumes that
>> kernel will correctly return if it supports or not
>> futex_atomic_cmpxchg_inatomic.
>>
>> Current PI mutex code already has runtime support by calling
>> prio_inherit_missing and returns ENOTSUP if the futex operation fails
>> at initialization (it issues a FUTEX_UNLOCK_PI futex operation).
>>
>> Also, current minimum supported kernel (v3.2) will return ENOSYS if
>> futex_atomic_cmpxchg_inatomic is not supported in the system:
>>
>> kernel/futex.c:
>>
>> 2628 long do_futex(u32 __user *uaddr, int op, u32 val, ktime_t *timeout,
>> 2629 u32 __user *uaddr2, u32 val2, u32 val3)
>> 2630 {
>> 2631 int ret = -ENOSYS, cmd = op & FUTEX_CMD_MASK;
>> [...]
>> 2667 case FUTEX_UNLOCK_PI:
>> 2668 if (futex_cmpxchg_enabled)
>> 2669 ret = futex_unlock_pi(uaddr, flags);
>> [...]
>> 2686 return ret;
>> 2687 }
>>
>> The futex_cmpxchg_enabled is initialized by calling cmpxchg_futex_value_locked,
>> which calls futex_atomic_cmpxchg_inatomic.
>>
>> For ARM futex_atomic_cmpxchg_inatomic will be either defined (if both
>> CONFIG_CPU_USE_DOMAINS and CONFIG_SMP are not defined) or use the
>> default generic implementation that returns ENOSYS.
>>
>> For m68k is uses the default generic implementation.
>>
>> For mips futex_atomic_cmpxchg_inatomic will return ENOSYS if cpu has no
>> 'cpu_has_llsc' support (defined by each chip supporte inside kernel).
>>
>> For sparc, 32-bit kernel will just use default generic implementation,
>> while 64-bit kernel has support.
>>
>> Tested on ARM (v3.8 kernel) and x86_64.
>>
>> * nptl/pthread_mutex_init.c [__ASSUME_FUTEX_LOCK_PI]
>> (prio_inherit_missing): Remove define.
>> * sysdeps/unix/sysv/linux/arm/kernel-features.h
>> (__ASSUME_FUTEX_LOCK_PI): Likewise.
>> * sysdeps/unix/sysv/linux/kernel-features.h (__ASSUME_FUTEX_LOCK_PI):
>> Likewise.
>> * sysdeps/unix/sysv/linux/m68k/kernel-features.h
>> (__ASSUME_FUTEX_LOCK_PI): Likewise.
>> * sysdeps/unix/sysv/linux/mips/kernel-features.h
>> (__ASSUME_FUTEX_LOCK_PI): Likewise.
>> * sysdeps/unix/sysv/linux/sparc/kernel-features.h
>> (__ASSUME_FUTEX_LOCK_PI): Likewise.
>> ---
>> ChangeLog | 15 +++++++++++++++
>> nptl/pthread_mutex_init.c | 3 ---
>> sysdeps/unix/sysv/linux/arm/kernel-features.h | 1 -
>> sysdeps/unix/sysv/linux/kernel-features.h | 4 ----
>> sysdeps/unix/sysv/linux/m68k/kernel-features.h | 1 -
>> sysdeps/unix/sysv/linux/mips/kernel-features.h | 1 -
>> sysdeps/unix/sysv/linux/sparc/kernel-features.h | 1 -
>> 7 files changed, 15 insertions(+), 11 deletions(-)
>>
>> diff --git a/nptl/pthread_mutex_init.c b/nptl/pthread_mutex_init.c
>> index 71ac7bc..6e5acb6 100644
>> --- a/nptl/pthread_mutex_init.c
>> +++ b/nptl/pthread_mutex_init.c
>> @@ -37,7 +37,6 @@ static bool
>> prio_inherit_missing (void)
>> {
>> #ifdef __NR_futex
>> -# ifndef __ASSUME_FUTEX_LOCK_PI
>> static int tpi_supported;
>> if (__glibc_unlikely (tpi_supported == 0))
>> {
>> @@ -48,8 +47,6 @@ prio_inherit_missing (void)
>> tpi_supported = INTERNAL_SYSCALL_ERRNO (ret, err) == ENOSYS ? -1 : 1;
>> }
>> return __glibc_unlikely (tpi_supported < 0);
>> -# endif
>> - return false;
>> #endif
>> return true;
>> }
>> diff --git a/sysdeps/unix/sysv/linux/arm/kernel-features.h b/sysdeps/unix/sysv/linux/arm/kernel-features.h
>> index 0a9ed77..6ca607e 100644
>> --- a/sysdeps/unix/sysv/linux/arm/kernel-features.h
>> +++ b/sysdeps/unix/sysv/linux/arm/kernel-features.h
>> @@ -23,7 +23,6 @@
>> futex_atomic_cmpxchg_inatomic, depending on kernel
>> configuration. */
>> #if __LINUX_KERNEL_VERSION < 0x030E03
>> -# undef __ASSUME_FUTEX_LOCK_PI
>> # undef __ASSUME_REQUEUE_PI
>> # undef __ASSUME_SET_ROBUST_LIST
>> #endif
>> diff --git a/sysdeps/unix/sysv/linux/kernel-features.h b/sysdeps/unix/sysv/linux/kernel-features.h
>> index 5a1b204..43b72b1 100644
>> --- a/sysdeps/unix/sysv/linux/kernel-features.h
>> +++ b/sysdeps/unix/sysv/linux/kernel-features.h
>> @@ -64,10 +64,6 @@
>> configurations). */
>> #define __ASSUME_SET_ROBUST_LIST 1
>>
>> -/* Support for PI futexes was added in 2.6.18 (but some architectures
>> - lack futex_atomic_cmpxchg_inatomic in some configurations). */
>> -#define __ASSUME_FUTEX_LOCK_PI 1
>> -
>> /* Support for private futexes was added in 2.6.22. */
>> #define __ASSUME_PRIVATE_FUTEX 1
>>
>> diff --git a/sysdeps/unix/sysv/linux/m68k/kernel-features.h b/sysdeps/unix/sysv/linux/m68k/kernel-features.h
>> index 646bc4b..9e7f0e1 100644
>> --- a/sysdeps/unix/sysv/linux/m68k/kernel-features.h
>> +++ b/sysdeps/unix/sysv/linux/m68k/kernel-features.h
>> @@ -51,7 +51,6 @@
>>
>> /* 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
>> diff --git a/sysdeps/unix/sysv/linux/mips/kernel-features.h b/sysdeps/unix/sysv/linux/mips/kernel-features.h
>> index e831645..09d5ece 100644
>> --- a/sysdeps/unix/sysv/linux/mips/kernel-features.h
>> +++ b/sysdeps/unix/sysv/linux/mips/kernel-features.h
>> @@ -24,7 +24,6 @@
>> /* 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
>> diff --git a/sysdeps/unix/sysv/linux/sparc/kernel-features.h b/sysdeps/unix/sysv/linux/sparc/kernel-features.h
>> index 386f230..69c9c7c 100644
>> --- a/sysdeps/unix/sysv/linux/sparc/kernel-features.h
>> +++ b/sysdeps/unix/sysv/linux/sparc/kernel-features.h
>> @@ -34,7 +34,6 @@
>> /* 32-bit SPARC kernels do not support
>> futex_atomic_cmpxchg_inatomic. */
>> #if !defined __arch64__ && !defined __sparc_v9__
>> -# undef __ASSUME_FUTEX_LOCK_PI
>> # undef __ASSUME_REQUEUE_PI
>> # undef __ASSUME_SET_ROBUST_LIST
>> #endif
>>
This is fine since the Linuxism in nptl/pthread_mutex_init.c is already
protected by #ifdef __NR_futex.
@@ -37,7 +37,6 @@ static bool
prio_inherit_missing (void)
{
#ifdef __NR_futex
-# ifndef __ASSUME_FUTEX_LOCK_PI
static int tpi_supported;
if (__glibc_unlikely (tpi_supported == 0))
{
@@ -48,8 +47,6 @@ prio_inherit_missing (void)
tpi_supported = INTERNAL_SYSCALL_ERRNO (ret, err) == ENOSYS ? -1 : 1;
}
return __glibc_unlikely (tpi_supported < 0);
-# endif
- return false;
#endif
return true;
}
@@ -23,7 +23,6 @@
futex_atomic_cmpxchg_inatomic, depending on kernel
configuration. */
#if __LINUX_KERNEL_VERSION < 0x030E03
-# undef __ASSUME_FUTEX_LOCK_PI
# undef __ASSUME_REQUEUE_PI
# undef __ASSUME_SET_ROBUST_LIST
#endif
@@ -64,10 +64,6 @@
configurations). */
#define __ASSUME_SET_ROBUST_LIST 1
-/* Support for PI futexes was added in 2.6.18 (but some architectures
- lack futex_atomic_cmpxchg_inatomic in some configurations). */
-#define __ASSUME_FUTEX_LOCK_PI 1
-
/* Support for private futexes was added in 2.6.22. */
#define __ASSUME_PRIVATE_FUTEX 1
@@ -51,7 +51,6 @@
/* 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
@@ -24,7 +24,6 @@
/* 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
@@ -34,7 +34,6 @@
/* 32-bit SPARC kernels do not support
futex_atomic_cmpxchg_inatomic. */
#if !defined __arch64__ && !defined __sparc_v9__
-# undef __ASSUME_FUTEX_LOCK_PI
# undef __ASSUME_REQUEUE_PI
# undef __ASSUME_SET_ROBUST_LIST
#endif