Message ID | 1463608638-7215-1-git-send-email-adhemerval.zanella@linaro.org |
---|---|
State | New |
Headers | show |
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.
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