[2/3] Remove __ASSUME_SET_ROBUST_LIST

Message ID 1463608638-7215-2-git-send-email-adhemerval.zanella@linaro.org
State Dropped
Headers

Commit Message

Adhemerval Zanella Netto May 18, 2016, 9:57 p.m. UTC
  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(-)
  

Comments

Adhemerval Zanella Netto May 24, 2016, 7:07 p.m. UTC | #1
Ping.

On 18/05/2016 18:57, Adhemerval Zanella wrote:
> 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/nptl/nptl-init.c b/nptl/nptl-init.c
> index bdbdfed..cad14c7 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 4edc74b..d479a3e 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 a834063..c3f4087 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 6e5acb6..6aef890 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 6ca607e..4012751 100644
> --- a/sysdeps/unix/sysv/linux/arm/kernel-features.h
> +++ b/sysdeps/unix/sysv/linux/arm/kernel-features.h
> @@ -24,7 +24,6 @@
>     configuration.  */
>  #if __LINUX_KERNEL_VERSION < 0x030E03
>  # undef __ASSUME_REQUEUE_PI
> -# undef __ASSUME_SET_ROBUST_LIST
>  #endif
>  
>  /* Define this if your 32-bit syscall API requires 64-bit register
> diff --git a/sysdeps/unix/sysv/linux/kernel-features.h b/sysdeps/unix/sysv/linux/kernel-features.h
> index 43b72b1..45edad5 100644
> --- a/sysdeps/unix/sysv/linux/kernel-features.h
> +++ b/sysdeps/unix/sysv/linux/kernel-features.h
> @@ -59,11 +59,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 9e7f0e1..bec9539 100644
> --- a/sysdeps/unix/sysv/linux/m68k/kernel-features.h
> +++ b/sysdeps/unix/sysv/linux/m68k/kernel-features.h
> @@ -52,5 +52,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 09d5ece..3640b5f 100644
> --- a/sysdeps/unix/sysv/linux/mips/kernel-features.h
> +++ b/sysdeps/unix/sysv/linux/mips/kernel-features.h
> @@ -25,7 +25,6 @@
>     emulating LL/SC.  */
>  #if __mips == 1 || defined _MIPS_ARCH_R5900
>  # undef __ASSUME_REQUEUE_PI
> -# undef __ASSUME_SET_ROBUST_LIST
>  #endif
>  
>  /* Define this if your 32-bit syscall API requires 64-bit register
> diff --git a/sysdeps/unix/sysv/linux/sparc/kernel-features.h b/sysdeps/unix/sysv/linux/sparc/kernel-features.h
> index 69c9c7c..dc7c4aa 100644
> --- a/sysdeps/unix/sysv/linux/sparc/kernel-features.h
> +++ b/sysdeps/unix/sysv/linux/sparc/kernel-features.h
> @@ -35,5 +35,4 @@
>     futex_atomic_cmpxchg_inatomic.  */
>  #if !defined __arch64__ && !defined __sparc_v9__
>  # undef __ASSUME_REQUEUE_PI
> -# undef __ASSUME_SET_ROBUST_LIST
>  #endif
>
  
Adhemerval Zanella Netto June 2, 2016, 5:47 p.m. UTC | #2
Ping.

On 24/05/2016 16:07, Adhemerval Zanella wrote:
> Ping.
> 
> On 18/05/2016 18:57, Adhemerval Zanella wrote:
>> 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/nptl/nptl-init.c b/nptl/nptl-init.c
>> index bdbdfed..cad14c7 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 4edc74b..d479a3e 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 a834063..c3f4087 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 6e5acb6..6aef890 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 6ca607e..4012751 100644
>> --- a/sysdeps/unix/sysv/linux/arm/kernel-features.h
>> +++ b/sysdeps/unix/sysv/linux/arm/kernel-features.h
>> @@ -24,7 +24,6 @@
>>     configuration.  */
>>  #if __LINUX_KERNEL_VERSION < 0x030E03
>>  # undef __ASSUME_REQUEUE_PI
>> -# undef __ASSUME_SET_ROBUST_LIST
>>  #endif
>>  
>>  /* Define this if your 32-bit syscall API requires 64-bit register
>> diff --git a/sysdeps/unix/sysv/linux/kernel-features.h b/sysdeps/unix/sysv/linux/kernel-features.h
>> index 43b72b1..45edad5 100644
>> --- a/sysdeps/unix/sysv/linux/kernel-features.h
>> +++ b/sysdeps/unix/sysv/linux/kernel-features.h
>> @@ -59,11 +59,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 9e7f0e1..bec9539 100644
>> --- a/sysdeps/unix/sysv/linux/m68k/kernel-features.h
>> +++ b/sysdeps/unix/sysv/linux/m68k/kernel-features.h
>> @@ -52,5 +52,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 09d5ece..3640b5f 100644
>> --- a/sysdeps/unix/sysv/linux/mips/kernel-features.h
>> +++ b/sysdeps/unix/sysv/linux/mips/kernel-features.h
>> @@ -25,7 +25,6 @@
>>     emulating LL/SC.  */
>>  #if __mips == 1 || defined _MIPS_ARCH_R5900
>>  # undef __ASSUME_REQUEUE_PI
>> -# undef __ASSUME_SET_ROBUST_LIST
>>  #endif
>>  
>>  /* Define this if your 32-bit syscall API requires 64-bit register
>> diff --git a/sysdeps/unix/sysv/linux/sparc/kernel-features.h b/sysdeps/unix/sysv/linux/sparc/kernel-features.h
>> index 69c9c7c..dc7c4aa 100644
>> --- a/sysdeps/unix/sysv/linux/sparc/kernel-features.h
>> +++ b/sysdeps/unix/sysv/linux/sparc/kernel-features.h
>> @@ -35,5 +35,4 @@
>>     futex_atomic_cmpxchg_inatomic.  */
>>  #if !defined __arch64__ && !defined __sparc_v9__
>>  # undef __ASSUME_REQUEUE_PI
>> -# undef __ASSUME_SET_ROBUST_LIST
>>  #endif
>>
  
Roland McGrath June 10, 2016, 9:11 p.m. UTC | #3
Please split this into a patch that touches only Linux-only code
(sysdeps/unix/sysv/linux) and another that touches generic code
(nptl).  The latter needs vetting for the non-Linux configurations.
  

Patch

diff --git a/nptl/nptl-init.c b/nptl/nptl-init.c
index bdbdfed..cad14c7 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 4edc74b..d479a3e 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 a834063..c3f4087 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 6e5acb6..6aef890 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 6ca607e..4012751 100644
--- a/sysdeps/unix/sysv/linux/arm/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/arm/kernel-features.h
@@ -24,7 +24,6 @@ 
    configuration.  */
 #if __LINUX_KERNEL_VERSION < 0x030E03
 # undef __ASSUME_REQUEUE_PI
-# undef __ASSUME_SET_ROBUST_LIST
 #endif
 
 /* Define this if your 32-bit syscall API requires 64-bit register
diff --git a/sysdeps/unix/sysv/linux/kernel-features.h b/sysdeps/unix/sysv/linux/kernel-features.h
index 43b72b1..45edad5 100644
--- a/sysdeps/unix/sysv/linux/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/kernel-features.h
@@ -59,11 +59,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 9e7f0e1..bec9539 100644
--- a/sysdeps/unix/sysv/linux/m68k/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/m68k/kernel-features.h
@@ -52,5 +52,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 09d5ece..3640b5f 100644
--- a/sysdeps/unix/sysv/linux/mips/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/mips/kernel-features.h
@@ -25,7 +25,6 @@ 
    emulating LL/SC.  */
 #if __mips == 1 || defined _MIPS_ARCH_R5900
 # undef __ASSUME_REQUEUE_PI
-# undef __ASSUME_SET_ROBUST_LIST
 #endif
 
 /* Define this if your 32-bit syscall API requires 64-bit register
diff --git a/sysdeps/unix/sysv/linux/sparc/kernel-features.h b/sysdeps/unix/sysv/linux/sparc/kernel-features.h
index 69c9c7c..dc7c4aa 100644
--- a/sysdeps/unix/sysv/linux/sparc/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/sparc/kernel-features.h
@@ -35,5 +35,4 @@ 
    futex_atomic_cmpxchg_inatomic.  */
 #if !defined __arch64__ && !defined __sparc_v9__
 # undef __ASSUME_REQUEUE_PI
-# undef __ASSUME_SET_ROBUST_LIST
 #endif