From 3501fea6908a747e4c9835228b4baaf06bc8e66b Mon Sep 17 00:00:00 2001 From: Adhemerval Zanella Date: Mon, 16 May 2016 19:01:10 -0300 Subject: Remove __ASSUME_SET_ROBUST_LIST This patch removes __ASSUME_SET_ROBUST_LIST usage and assumes that kernel will correctly return if it supports or not futex_atomic_cmpxchg_inatomic. On minimum supported kernel (v3.2 and v2.6.32 for x86) kernel has: 2418 SYSCALL_DEFINE2(set_robust_list, struct robust_list_head __user *, head, 2419 size_t, len) 2420 { 2421 if (!futex_cmpxchg_enabled) 2422 return -ENOSYS; The patch also adds the __set_robust_list_avail runtime check for all architectures, since for some the syscall may still return ENOSYS if futex_atomic_cmpxchg_inatomic is not supported (for instance ARM). Tested on armhf (with 3.8 kernel) and x86_64. * nptl/nptl-init.c [__ASSUME_SET_ROBUST_LIST] (__set_robust_list_avail): Remove define. [__NR_set_robust_list] (__pthread_initialize_minimal_internal): Likewise. * nptl/pthreadP.h [__ASSUME_SET_ROBUST_LIST] (__set_robust_list_avail): Likewise. * nptl/pthread_create.c [__NR_set_robust_list && !__ASSUME_SET_ROBUST_LIST] (START_THREAD_DEFN): Likewise. * nptl/pthread_mutex_init.c [!__ASSUME_SET_ROBUST_LIST] (__pthread_mutex_init): Likewise. * sysdeps/unix/sysv/linux/arm/kernel-features.h (__ASSUME_SET_ROBUST_LIST): Likewise. * sysdeps/unix/sysv/linux/kernel-features.h: (__ASSUME_SET_ROBUST_LIST): Likewise. * sysdeps/unix/sysv/linux/m68k/kernel-features.h: (__ASSUME_SET_ROBUST_LIST): Likewise. * sysdeps/unix/sysv/linux/mips/kernel-features.h: (__ASSUME_SET_ROBUST_LIST): Likewise. * sysdeps/unix/sysv/linux/sparc/kernel-features.h: (__ASSUME_SET_ROBUST_LIST): Likewise. --- ChangeLog | 22 ++++++++++++++++++++++ nptl/nptl-init.c | 11 ++--------- nptl/pthreadP.h | 2 -- nptl/pthread_create.c | 8 +------- nptl/pthread_mutex_init.c | 2 -- sysdeps/unix/sysv/linux/arm/kernel-features.h | 1 - sysdeps/unix/sysv/linux/kernel-features.h | 5 ----- 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 - 10 files changed, 25 insertions(+), 29 deletions(-) diff --git a/ChangeLog b/ChangeLog index feef0a6b99..9657658f61 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,27 @@ 2016-06-03 Adhemerval Zanella + * nptl/nptl-init.c [__ASSUME_SET_ROBUST_LIST] + (__set_robust_list_avail): Remove define. + [__NR_set_robust_list] (__pthread_initialize_minimal_internal): + Likewise. + * nptl/pthreadP.h [__ASSUME_SET_ROBUST_LIST] + (__set_robust_list_avail): Likewise. + * nptl/pthread_create.c + [__NR_set_robust_list && !__ASSUME_SET_ROBUST_LIST] + (START_THREAD_DEFN): Likewise. + * nptl/pthread_mutex_init.c [!__ASSUME_SET_ROBUST_LIST] + (__pthread_mutex_init): Likewise. + * sysdeps/unix/sysv/linux/arm/kernel-features.h + (__ASSUME_SET_ROBUST_LIST): Likewise. + * sysdeps/unix/sysv/linux/kernel-features.h: + (__ASSUME_SET_ROBUST_LIST): Likewise. + * sysdeps/unix/sysv/linux/m68k/kernel-features.h: + (__ASSUME_SET_ROBUST_LIST): Likewise. + * sysdeps/unix/sysv/linux/mips/kernel-features.h: + (__ASSUME_SET_ROBUST_LIST): Likewise. + * sysdeps/unix/sysv/linux/sparc/kernel-features.h: + (__ASSUME_SET_ROBUST_LIST): Likewise. + * nptl/pthread_mutex_init.c [__ASSUME_FUTEX_LOCK_PI] (prio_inherit_missing): Remove define. * sysdeps/unix/sysv/linux/arm/kernel-features.h diff --git a/nptl/nptl-init.c b/nptl/nptl-init.c index bdbdfedcef..cad14c7b86 100644 --- a/nptl/nptl-init.c +++ b/nptl/nptl-init.c @@ -48,14 +48,8 @@ int *__libc_multiple_threads_ptr attribute_hidden; size_t __static_tls_size; size_t __static_tls_align_m1; -#ifndef __ASSUME_SET_ROBUST_LIST /* Negative if we do not have the system call and we can use it. */ int __set_robust_list_avail; -# define set_robust_list_not_avail() \ - __set_robust_list_avail = -1 -#else -# define set_robust_list_not_avail() do { } while (0) -#endif #ifndef __ASSUME_FUTEX_CLOCK_REALTIME /* Nonzero if we do not have FUTEX_CLOCK_REALTIME. */ @@ -328,7 +322,7 @@ __pthread_initialize_minimal_internal (void) pd->robust_prev = &pd->robust_head; #endif pd->robust_head.list = &pd->robust_head; -#ifdef __NR_set_robust_list + pd->robust_head.futex_offset = (offsetof (pthread_mutex_t, __data.__lock) - offsetof (pthread_mutex_t, __data.__list.__next)); @@ -336,8 +330,7 @@ __pthread_initialize_minimal_internal (void) int res = INTERNAL_SYSCALL (set_robust_list, err, 2, &pd->robust_head, sizeof (struct robust_list_head)); if (INTERNAL_SYSCALL_ERROR_P (res, err)) -#endif - set_robust_list_not_avail (); + __set_robust_list_avail = -1; } #ifdef __NR_futex diff --git a/nptl/pthreadP.h b/nptl/pthreadP.h index 4edc74b1ef..d479a3e4e5 100644 --- a/nptl/pthreadP.h +++ b/nptl/pthreadP.h @@ -199,10 +199,8 @@ hidden_proto (__pthread_keys) /* Number of threads running. */ extern unsigned int __nptl_nthreads attribute_hidden; -#ifndef __ASSUME_SET_ROBUST_LIST /* Negative if we do not have the system call and we can use it. */ extern int __set_robust_list_avail attribute_hidden; -#endif /* Thread Priority Protection. */ extern int __sched_fifo_min_prio attribute_hidden; diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c index 5216041733..1859cee5a3 100644 --- a/nptl/pthread_create.c +++ b/nptl/pthread_create.c @@ -271,10 +271,7 @@ START_THREAD_DEFN if (__glibc_unlikely (atomic_exchange_acq (&pd->setxid_futex, 0) == -2)) futex_wake (&pd->setxid_futex, 1, FUTEX_PRIVATE); -#ifdef __NR_set_robust_list -# ifndef __ASSUME_SET_ROBUST_LIST - if (__set_robust_list_avail >= 0) -# endif + if (__glibc_likely (__set_robust_list_avail >= 0)) { INTERNAL_SYSCALL_DECL (err); /* This call should never fail because the initial call in init.c @@ -282,7 +279,6 @@ START_THREAD_DEFN INTERNAL_SYSCALL (set_robust_list, err, 2, &pd->robust_head, sizeof (struct robust_list_head)); } -#endif #ifdef SIGCANCEL /* If the parent was running cancellation handlers while creating @@ -388,7 +384,6 @@ START_THREAD_DEFN the breakpoint reports TD_THR_RUN state rather than TD_THR_ZOMBIE. */ atomic_bit_set (&pd->cancelhandling, EXITING_BIT); -#ifndef __ASSUME_SET_ROBUST_LIST /* If this thread has any robust mutexes locked, handle them now. */ # ifdef __PTHREAD_MUTEX_HAVE_PREV void *robust = pd->robust_head.list; @@ -419,7 +414,6 @@ START_THREAD_DEFN } while (robust != (void *) &pd->robust_head); } -#endif /* Mark the memory of the stack as usable to the kernel. We free everything except for the space used for the TCB itself. */ diff --git a/nptl/pthread_mutex_init.c b/nptl/pthread_mutex_init.c index 6e5acb6112..6aef89029e 100644 --- a/nptl/pthread_mutex_init.c +++ b/nptl/pthread_mutex_init.c @@ -91,11 +91,9 @@ __pthread_mutex_init (pthread_mutex_t *mutex, if ((imutexattr->mutexkind & PTHREAD_MUTEXATTR_FLAG_ROBUST) != 0) { -#ifndef __ASSUME_SET_ROBUST_LIST if ((imutexattr->mutexkind & PTHREAD_MUTEXATTR_FLAG_PSHARED) != 0 && __set_robust_list_avail < 0) return ENOTSUP; -#endif mutex->__data.__kind |= PTHREAD_MUTEX_ROBUST_NORMAL_NP; } diff --git a/sysdeps/unix/sysv/linux/arm/kernel-features.h b/sysdeps/unix/sysv/linux/arm/kernel-features.h index 2b85a4029a..5829583825 100644 --- a/sysdeps/unix/sysv/linux/arm/kernel-features.h +++ b/sysdeps/unix/sysv/linux/arm/kernel-features.h @@ -39,5 +39,4 @@ configuration. */ #if __LINUX_KERNEL_VERSION < 0x030E03 # 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 63a6e11cf0..102addf093 100644 --- a/sysdeps/unix/sysv/linux/kernel-features.h +++ b/sysdeps/unix/sysv/linux/kernel-features.h @@ -64,11 +64,6 @@ they were introduced in 2.6.17-rc1, on SH in 2.6.19-rc1. */ #define __ASSUME_ATFCTS 1 -/* Support for inter-process robust mutexes was added in 2.6.17 (but - some architectures lack futex_atomic_cmpxchg_inatomic in some - configurations). */ -#define __ASSUME_SET_ROBUST_LIST 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 9bde49c728..27c5efef62 100644 --- a/sysdeps/unix/sysv/linux/m68k/kernel-features.h +++ b/sysdeps/unix/sysv/linux/m68k/kernel-features.h @@ -55,5 +55,4 @@ /* No support for PI futexes or robust mutexes before 3.10 for m68k. */ #if __LINUX_KERNEL_VERSION < 0x030a00 # 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 e84e84cfe6..f23620875c 100644 --- a/sysdeps/unix/sysv/linux/mips/kernel-features.h +++ b/sysdeps/unix/sysv/linux/mips/kernel-features.h @@ -44,5 +44,4 @@ emulating LL/SC. */ #if __mips == 1 || defined _MIPS_ARCH_R5900 # 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 2469159e9a..0b5efd7243 100644 --- a/sysdeps/unix/sysv/linux/sparc/kernel-features.h +++ b/sysdeps/unix/sysv/linux/sparc/kernel-features.h @@ -42,5 +42,4 @@ futex_atomic_cmpxchg_inatomic. */ #if !defined __arch64__ && !defined __sparc_v9__ # undef __ASSUME_REQUEUE_PI -# undef __ASSUME_SET_ROBUST_LIST #endif -- cgit 1.4.1