Message ID | 1509038067-18532-3-git-send-email-adhemerval.zanella@linaro.org |
---|---|
State | Accepted |
Commit | 06be6368da16104be51ebf23f7c68a51f321673f |
Headers | show |
Series | [v2,1/3] nptl: Add tests for internal pthread_mutex_t offsets | expand |
Ping. On 26/10/2017 15:14, Adhemerval Zanella wrote: > Changes from previous version: > > - Fixed __nusers placement for __PTHREAD_MUTEX_NUSERS_AFTER_KIND. > - Fixed typos. > > --- > > This patch adds two new internal defines to set the internal > pthread_mutex_t layout required by the supported ABIS: > > 1. __PTHREAD_MUTEX_NUSERS_AFTER_KIND which control whether to define > __nusers fields before or after __kind. The preferred value for > is 0 for new ports and it sets __nusers before __kind. > > 2. __PTHREAD_MUTEX_USE_UNION which control whether internal __spins and > __list members will be place inside an union for linuxthreads > compatibility. The preferred value is 0 for ports and it sets > to not use an union to define both fields. > > It fixes the wrong offsets value for __kind value on x86_64-linux-gnu-x32. > Checked with a make check run-built-tests=no on all afected ABIs. > > Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org> > > [BZ #22298] > * nptl/allocatestack.c (allocate_stack): Check if > __PTHREAD_MUTEX_HAVE_PREV is non-zero, instead if > __PTHREAD_MUTEX_HAVE_PREV is defined. > * nptl/descr.h (pthread): Likewise. > * nptl/nptl-init.c (__pthread_initialize_minimal_internal): > Likewise. > * nptl/pthread_create.c (START_THREAD_DEFN): Likewise. > * sysdeps/nptl/fork.c (__libc_fork): Likewise. > * sysdeps/nptl/pthread.h (PTHREAD_MUTEX_INITIALIZER): Likewise. > * sysdeps/nptl/bits/thread-shared-types.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > (__pthread_internal_list): Check __PTHREAD_MUTEX_USE_UNION instead > of __WORDSIZE for internal layout. > (__pthread_mutex_s): Check __PTHREAD_MUTEX_NUSERS_AFTER_KIND instead > of __WORDSIZE for internal __nusers layout and __PTHREAD_MUTEX_USE_UNION > instead of __WORDSIZE whether to use an union for __spins and __list > fields. > (__PTHREAD_MUTEX_HAVE_PREV): Define also for __PTHREAD_MUTEX_USE_UNION > case. > * sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > * sysdeps/alpha/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > * sysdeps/arm/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > * sysdeps/hppa/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > * sysdeps/ia64/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > * sysdeps/m68k/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > * sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > * sysdeps/mips/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > * sysdeps/nios2/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > * sysdeps/powerpc/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > * sysdeps/s390/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > * sysdeps/sh/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > * sysdeps/sparc/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > * sysdeps/tile/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > * sysdeps/x86/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > --- > ChangeLog | 67 ++++++++++++++++++++++++ > nptl/allocatestack.c | 2 +- > nptl/descr.h | 2 +- > nptl/nptl-init.c | 2 +- > nptl/pthread_create.c | 4 +- > sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h | 2 + > sysdeps/alpha/nptl/bits/pthreadtypes-arch.h | 2 + > sysdeps/arm/nptl/bits/pthreadtypes-arch.h | 2 + > sysdeps/hppa/nptl/bits/pthreadtypes-arch.h | 2 + > sysdeps/ia64/nptl/bits/pthreadtypes-arch.h | 2 + > sysdeps/m68k/nptl/bits/pthreadtypes-arch.h | 2 + > sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h | 2 + > sysdeps/mips/nptl/bits/pthreadtypes-arch.h | 2 + > sysdeps/nios2/nptl/bits/pthreadtypes-arch.h | 2 + > sysdeps/nptl/bits/thread-shared-types.h | 32 +++++++++-- > sysdeps/nptl/fork.c | 2 +- > sysdeps/nptl/pthread.h | 2 +- > sysdeps/powerpc/nptl/bits/pthreadtypes-arch.h | 2 + > sysdeps/s390/nptl/bits/pthreadtypes-arch.h | 2 + > sysdeps/sh/nptl/bits/pthreadtypes-arch.h | 2 + > sysdeps/sparc/nptl/bits/pthreadtypes-arch.h | 2 + > sysdeps/tile/nptl/bits/pthreadtypes-arch.h | 2 + > sysdeps/x86/nptl/bits/pthreadtypes-arch.h | 7 +++ > 23 files changed, 136 insertions(+), 12 deletions(-) > > diff --git a/ChangeLog b/ChangeLog > index 09e25be..203f014 100644 > --- a/ChangeLog > +++ b/ChangeLog > @@ -1,5 +1,72 @@ > 2017-10-25 Adhemerval Zanella <adhemerval.zanella@linaro.org> > > + [BZ #22298] > + * nptl/allocatestack.c (allocate_stack): Check if > + __PTHREAD_MUTEX_HAVE_PREV is non-zero, instead if > + __PTHREAD_MUTEX_HAVE_PREV is defined. > + * nptl/descr.h (pthread): Likewise. > + * nptl/nptl-init.c (__pthread_initialize_minimal_internal): > + Likewise. > + * nptl/pthread_create.c (START_THREAD_DEFN): Likewise. > + * sysdeps/nptl/fork.c (__libc_fork): Likewise. > + * sysdeps/nptl/pthread.h (PTHREAD_MUTEX_INITIALIZER): Likewise. > + * sysdeps/nptl/bits/thread-shared-types.h > + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > + defines. > + (__pthread_internal_list): Check __PTHREAD_MUTEX_USE_UNION instead > + of __WORDSIZE for internal layout. > + (__pthread_mutex_s): Check __PTHREAD_MUTEX_NUSERS_AFTER_KIND instead > + of __WORDSIZE for internal __nusers layout and __PTHREAD_MUTEX_USE_UNION > + instead of __WORDSIZE whether to use an union for __spins and __list > + fields. > + (__PTHREAD_MUTEX_HAVE_PREV): Define also for __PTHREAD_MUTEX_USE_UNION > + case. > + * sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h > + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > + defines. > + * sysdeps/alpha/nptl/bits/pthreadtypes-arch.h > + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > + defines. > + * sysdeps/arm/nptl/bits/pthreadtypes-arch.h > + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > + defines. > + * sysdeps/hppa/nptl/bits/pthreadtypes-arch.h > + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > + defines. > + * sysdeps/ia64/nptl/bits/pthreadtypes-arch.h > + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > + defines. > + * sysdeps/m68k/nptl/bits/pthreadtypes-arch.h > + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > + defines. > + * sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h > + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > + defines. > + * sysdeps/mips/nptl/bits/pthreadtypes-arch.h > + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > + defines. > + * sysdeps/nios2/nptl/bits/pthreadtypes-arch.h > + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > + defines. > + * sysdeps/powerpc/nptl/bits/pthreadtypes-arch.h > + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > + defines. > + * sysdeps/s390/nptl/bits/pthreadtypes-arch.h > + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > + defines. > + * sysdeps/sh/nptl/bits/pthreadtypes-arch.h > + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > + defines. > + * sysdeps/sparc/nptl/bits/pthreadtypes-arch.h > + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > + defines. > + * sysdeps/tile/nptl/bits/pthreadtypes-arch.h > + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > + defines. > + * sysdeps/x86/nptl/bits/pthreadtypes-arch.h > + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > + defines. > + > * nptl/pthreadP.h (ASSERT_TYPE_SIZE, ASSERT_PTHREAD_INTERNAL_SIZE): > New macros. > * nptl/pthread_attr_init.c (__pthread_mutex_init): Add build time > diff --git a/nptl/allocatestack.c b/nptl/allocatestack.c > index ad9add8..1cc7893 100644 > --- a/nptl/allocatestack.c > +++ b/nptl/allocatestack.c > @@ -753,7 +753,7 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp, > - offsetof (pthread_mutex_t, > __data.__list.__next)); > pd->robust_head.list_op_pending = NULL; > -#ifdef __PTHREAD_MUTEX_HAVE_PREV > +#if __PTHREAD_MUTEX_HAVE_PREV > pd->robust_prev = &pd->robust_head; > #endif > pd->robust_head.list = &pd->robust_head; > diff --git a/nptl/descr.h b/nptl/descr.h > index c5ad0c8..c83b17b 100644 > --- a/nptl/descr.h > +++ b/nptl/descr.h > @@ -169,7 +169,7 @@ struct pthread > pid_t pid_ununsed; > > /* List of robust mutexes the thread is holding. */ > -#ifdef __PTHREAD_MUTEX_HAVE_PREV > +#if __PTHREAD_MUTEX_HAVE_PREV > void *robust_prev; > struct robust_list_head robust_head; > > diff --git a/nptl/nptl-init.c b/nptl/nptl-init.c > index 2921607..869e926 100644 > --- a/nptl/nptl-init.c > +++ b/nptl/nptl-init.c > @@ -297,7 +297,7 @@ __pthread_initialize_minimal_internal (void) > > /* Initialize the robust mutex data. */ > { > -#ifdef __PTHREAD_MUTEX_HAVE_PREV > +#if __PTHREAD_MUTEX_HAVE_PREV > pd->robust_prev = &pd->robust_head; > #endif > pd->robust_head.list = &pd->robust_head; > diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c > index 992331e..51ae60d 100644 > --- a/nptl/pthread_create.c > +++ b/nptl/pthread_create.c > @@ -518,7 +518,7 @@ START_THREAD_DEFN > > #ifndef __ASSUME_SET_ROBUST_LIST > /* If this thread has any robust mutexes locked, handle them now. */ > -# ifdef __PTHREAD_MUTEX_HAVE_PREV > +# if __PTHREAD_MUTEX_HAVE_PREV > void *robust = pd->robust_head.list; > # else > __pthread_slist_t *robust = pd->robust_list.__next; > @@ -536,7 +536,7 @@ START_THREAD_DEFN > __list.__next)); > robust = *((void **) robust); > > -# ifdef __PTHREAD_MUTEX_HAVE_PREV > +# if __PTHREAD_MUTEX_HAVE_PREV > this->__list.__prev = NULL; > # endif > this->__list.__next = NULL; > diff --git a/sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h b/sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h > index d13a75d..9ab23d0 100644 > --- a/sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h > +++ b/sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h > @@ -45,6 +45,8 @@ > #define __PTHREAD_COMPAT_PADDING_MID > #define __PTHREAD_COMPAT_PADDING_END > #define __PTHREAD_MUTEX_LOCK_ELISION 0 > +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 0 > +#define __PTHREAD_MUTEX_USE_UNION 0 > > #define __LOCK_ALIGNMENT > #define __ONCE_ALIGNMENT > diff --git a/sysdeps/alpha/nptl/bits/pthreadtypes-arch.h b/sysdeps/alpha/nptl/bits/pthreadtypes-arch.h > index b6f6cb1..429df10 100644 > --- a/sysdeps/alpha/nptl/bits/pthreadtypes-arch.h > +++ b/sysdeps/alpha/nptl/bits/pthreadtypes-arch.h > @@ -33,6 +33,8 @@ > #define __PTHREAD_COMPAT_PADDING_MID > #define __PTHREAD_COMPAT_PADDING_END > #define __PTHREAD_MUTEX_LOCK_ELISION 0 > +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 0 > +#define __PTHREAD_MUTEX_USE_UNION 0 > > #define __LOCK_ALIGNMENT > #define __ONCE_ALIGNMENT > diff --git a/sysdeps/arm/nptl/bits/pthreadtypes-arch.h b/sysdeps/arm/nptl/bits/pthreadtypes-arch.h > index 3f9eca4..3911c81 100644 > --- a/sysdeps/arm/nptl/bits/pthreadtypes-arch.h > +++ b/sysdeps/arm/nptl/bits/pthreadtypes-arch.h > @@ -34,6 +34,8 @@ > #define __PTHREAD_COMPAT_PADDING_MID > #define __PTHREAD_COMPAT_PADDING_END > #define __PTHREAD_MUTEX_LOCK_ELISION 0 > +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 1 > +#define __PTHREAD_MUTEX_USE_UNION 1 > > #define __LOCK_ALIGNMENT > #define __ONCE_ALIGNMENT > diff --git a/sysdeps/hppa/nptl/bits/pthreadtypes-arch.h b/sysdeps/hppa/nptl/bits/pthreadtypes-arch.h > index c158562..865a14e 100644 > --- a/sysdeps/hppa/nptl/bits/pthreadtypes-arch.h > +++ b/sysdeps/hppa/nptl/bits/pthreadtypes-arch.h > @@ -48,6 +48,8 @@ > pthread_mutex_t is larger than Linuxthreads. */ > #define __PTHREAD_COMPAT_PADDING_END int __reserved[2]; > #define __PTHREAD_MUTEX_LOCK_ELISION 0 > +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 1 > +#define __PTHREAD_MUTEX_USE_UNION 1 > > #define __LOCK_ALIGNMENT __attribute__ ((__aligned__(16))) > #define __ONCE_ALIGNMENT > diff --git a/sysdeps/ia64/nptl/bits/pthreadtypes-arch.h b/sysdeps/ia64/nptl/bits/pthreadtypes-arch.h > index 631cb33..2a3bc75 100644 > --- a/sysdeps/ia64/nptl/bits/pthreadtypes-arch.h > +++ b/sysdeps/ia64/nptl/bits/pthreadtypes-arch.h > @@ -33,6 +33,8 @@ > #define __PTHREAD_COMPAT_PADDING_MID > #define __PTHREAD_COMPAT_PADDING_END > #define __PTHREAD_MUTEX_LOCK_ELISION 0 > +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 0 > +#define __PTHREAD_MUTEX_USE_UNION 0 > > #define __LOCK_ALIGNMENT > #define __ONCE_ALIGNMENT > diff --git a/sysdeps/m68k/nptl/bits/pthreadtypes-arch.h b/sysdeps/m68k/nptl/bits/pthreadtypes-arch.h > index 845b9e6..966cc75 100644 > --- a/sysdeps/m68k/nptl/bits/pthreadtypes-arch.h > +++ b/sysdeps/m68k/nptl/bits/pthreadtypes-arch.h > @@ -35,6 +35,8 @@ > #define __PTHREAD_COMPAT_PADDING_MID > #define __PTHREAD_COMPAT_PADDING_END > #define __PTHREAD_MUTEX_LOCK_ELISION 0 > +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 1 > +#define __PTHREAD_MUTEX_USE_UNION 1 > > #define __LOCK_ALIGNMENT __attribute__ ((__aligned__ (4))) > #define __ONCE_ALIGNMENT __attribute__ ((__aligned__ (4))) > diff --git a/sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h b/sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h > index d687e2c..e44f2dc 100644 > --- a/sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h > +++ b/sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h > @@ -35,6 +35,8 @@ > #define __PTHREAD_COMPAT_PADDING_MID > #define __PTHREAD_COMPAT_PADDING_END > #define __PTHREAD_MUTEX_LOCK_ELISION 0 > +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 1 > +#define __PTHREAD_MUTEX_USE_UNION 1 > > #define __LOCK_ALIGNMENT > #define __ONCE_ALIGNMENT > diff --git a/sysdeps/mips/nptl/bits/pthreadtypes-arch.h b/sysdeps/mips/nptl/bits/pthreadtypes-arch.h > index 6aa1bda..f03389a 100644 > --- a/sysdeps/mips/nptl/bits/pthreadtypes-arch.h > +++ b/sysdeps/mips/nptl/bits/pthreadtypes-arch.h > @@ -42,6 +42,8 @@ > #define __PTHREAD_COMPAT_PADDING_MID > #define __PTHREAD_COMPAT_PADDING_END > #define __PTHREAD_MUTEX_LOCK_ELISION 0 > +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND (_MIPS_SIM != _ABI64) > +#define __PTHREAD_MUTEX_USE_UNION (_MIPS_SIM != _ABI64) > > #define __LOCK_ALIGNMENT > #define __ONCE_ALIGNMENT > diff --git a/sysdeps/nios2/nptl/bits/pthreadtypes-arch.h b/sysdeps/nios2/nptl/bits/pthreadtypes-arch.h > index e2732f9..83f8684 100644 > --- a/sysdeps/nios2/nptl/bits/pthreadtypes-arch.h > +++ b/sysdeps/nios2/nptl/bits/pthreadtypes-arch.h > @@ -35,6 +35,8 @@ > #define __PTHREAD_COMPAT_PADDING_MID > #define __PTHREAD_COMPAT_PADDING_END > #define __PTHREAD_MUTEX_LOCK_ELISION 0 > +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 1 > +#define __PTHREAD_MUTEX_USE_UNION 1 > > #define __LOCK_ALIGNMENT > #define __ONCE_ALIGNMENT > diff --git a/sysdeps/nptl/bits/thread-shared-types.h b/sysdeps/nptl/bits/thread-shared-types.h > index 68b82b6..da4358a 100644 > --- a/sysdeps/nptl/bits/thread-shared-types.h > +++ b/sysdeps/nptl/bits/thread-shared-types.h > @@ -42,6 +42,25 @@ > the internal structure. > __PTHREAD_MUTEX_LOCK_ELISION - 1 if the architecture supports lock > elision or 0 otherwise. > + __PTHREAD_MUTEX_NUSERS_AFTER_KIND - control where to put __nusers. The > + preferred value for new architectures > + is 0. > + __PTHREAD_MUTEX_USE_UNION - control whether internal __spins and > + __list will be place inside a union for > + linuxthreads compatibility. > + The preferred value for new architectures > + is 0. > + > + For a new port the preferred values for the required defines are: > + > + #define __PTHREAD_COMPAT_PADDING_MID > + #define __PTHREAD_COMPAT_PADDING_END > + #define __PTHREAD_MUTEX_LOCK_ELISION 0 > + #define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 0 > + #define __PTHREAD_MUTEX_USE_UNION 0 > + > + __PTHREAD_MUTEX_LOCK_ELISION can be set to 1 if the hardware plans to > + eventually support lock elision using transactional memory. > > The additional macro defines any constraint for the lock alignment > inside the thread structures: > @@ -59,7 +78,7 @@ > > /* Common definition of pthread_mutex_t. */ > > -#if __WORDSIZE == 64 > +#if !__PTHREAD_MUTEX_USE_UNION > typedef struct __pthread_internal_list > { > struct __pthread_internal_list *__prev; > @@ -74,7 +93,7 @@ typedef struct __pthread_internal_slist > > /* Lock elision support. */ > #if __PTHREAD_MUTEX_LOCK_ELISION > -# if __WORDSIZE == 64 > +# if !__PTHREAD_MUTEX_USE_UNION > # define __PTHREAD_SPINS_DATA \ > short __spins; \ > short __elision > @@ -101,24 +120,27 @@ struct __pthread_mutex_s > int __lock __LOCK_ALIGNMENT; > unsigned int __count; > int __owner; > -#if __WORDSIZE == 64 > +#if !__PTHREAD_MUTEX_NUSERS_AFTER_KIND > unsigned int __nusers; > #endif > /* KIND must stay at this position in the structure to maintain > binary compatibility with static initializers. */ > int __kind; > __PTHREAD_COMPAT_PADDING_MID > -#if __WORDSIZE == 64 > +#if __PTHREAD_MUTEX_NUSERS_AFTER_KIND > + unsigned int __nusers; > +#endif > +#if !__PTHREAD_MUTEX_USE_UNION > __PTHREAD_SPINS_DATA; > __pthread_list_t __list; > # define __PTHREAD_MUTEX_HAVE_PREV 1 > #else > - unsigned int __nusers; > __extension__ union > { > __PTHREAD_SPINS_DATA; > __pthread_slist_t __list; > }; > +# define __PTHREAD_MUTEX_HAVE_PREV 0 > #endif > __PTHREAD_COMPAT_PADDING_END > }; > diff --git a/sysdeps/nptl/fork.c b/sysdeps/nptl/fork.c > index 4bb87e2..48676c2 100644 > --- a/sysdeps/nptl/fork.c > +++ b/sysdeps/nptl/fork.c > @@ -166,7 +166,7 @@ __libc_fork (void) > inherit the correct value from the parent. We do not need to clear > the pending operation because it must have been zero when fork was > called. */ > -# ifdef __PTHREAD_MUTEX_HAVE_PREV > +# if __PTHREAD_MUTEX_HAVE_PREV > self->robust_prev = &self->robust_head; > # endif > self->robust_head.list = &self->robust_head; > diff --git a/sysdeps/nptl/pthread.h b/sysdeps/nptl/pthread.h > index 632ea7b..2b2b386 100644 > --- a/sysdeps/nptl/pthread.h > +++ b/sysdeps/nptl/pthread.h > @@ -83,7 +83,7 @@ enum > #endif > > > -#ifdef __PTHREAD_MUTEX_HAVE_PREV > +#if __PTHREAD_MUTEX_HAVE_PREV > # define PTHREAD_MUTEX_INITIALIZER \ > { { 0, 0, 0, 0, 0, __PTHREAD_SPINS, { 0, 0 } } } > # ifdef __USE_GNU > diff --git a/sysdeps/powerpc/nptl/bits/pthreadtypes-arch.h b/sysdeps/powerpc/nptl/bits/pthreadtypes-arch.h > index f29119b..8158cb5 100644 > --- a/sysdeps/powerpc/nptl/bits/pthreadtypes-arch.h > +++ b/sysdeps/powerpc/nptl/bits/pthreadtypes-arch.h > @@ -42,6 +42,8 @@ > #define __PTHREAD_COMPAT_PADDING_MID > #define __PTHREAD_COMPAT_PADDING_END > #define __PTHREAD_MUTEX_LOCK_ELISION 1 > +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND (__WORDSIZE != 64) > +#define __PTHREAD_MUTEX_USE_UNION (__WORDSIZE != 64) > > #define __LOCK_ALIGNMENT > #define __ONCE_ALIGNMENT > diff --git a/sysdeps/s390/nptl/bits/pthreadtypes-arch.h b/sysdeps/s390/nptl/bits/pthreadtypes-arch.h > index 3a9ac57..1ae2773 100644 > --- a/sysdeps/s390/nptl/bits/pthreadtypes-arch.h > +++ b/sysdeps/s390/nptl/bits/pthreadtypes-arch.h > @@ -45,6 +45,8 @@ > #else > #define __PTHREAD_MUTEX_LOCK_ELISION 0 > #endif > +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND (__WORDSIZE != 64) > +#define __PTHREAD_MUTEX_USE_UNION (__WORDSIZE != 64) > > #define __LOCK_ALIGNMENT > #define __ONCE_ALIGNMENT > diff --git a/sysdeps/sh/nptl/bits/pthreadtypes-arch.h b/sysdeps/sh/nptl/bits/pthreadtypes-arch.h > index b2615fe..e707751 100644 > --- a/sysdeps/sh/nptl/bits/pthreadtypes-arch.h > +++ b/sysdeps/sh/nptl/bits/pthreadtypes-arch.h > @@ -34,6 +34,8 @@ > #define __PTHREAD_COMPAT_PADDING_MID > #define __PTHREAD_COMPAT_PADDING_END > #define __PTHREAD_MUTEX_LOCK_ELISION 0 > +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 1 > +#define __PTHREAD_MUTEX_USE_UNION 1 > > #define __LOCK_ALIGNMENT > #define __ONCE_ALIGNMENT > diff --git a/sysdeps/sparc/nptl/bits/pthreadtypes-arch.h b/sysdeps/sparc/nptl/bits/pthreadtypes-arch.h > index 1e188cf..0f96f37 100644 > --- a/sysdeps/sparc/nptl/bits/pthreadtypes-arch.h > +++ b/sysdeps/sparc/nptl/bits/pthreadtypes-arch.h > @@ -43,6 +43,8 @@ > #define __PTHREAD_COMPAT_PADDING_MID > #define __PTHREAD_COMPAT_PADDING_END > #define __PTHREAD_MUTEX_LOCK_ELISION 0 > +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND (__WORDSIZE != 64) > +#define __PTHREAD_MUTEX_USE_UNION (__WORDSIZE != 64) > > #define __LOCK_ALIGNMENT > #define __ONCE_ALIGNMENT > diff --git a/sysdeps/tile/nptl/bits/pthreadtypes-arch.h b/sysdeps/tile/nptl/bits/pthreadtypes-arch.h > index 145ee42..054474f 100644 > --- a/sysdeps/tile/nptl/bits/pthreadtypes-arch.h > +++ b/sysdeps/tile/nptl/bits/pthreadtypes-arch.h > @@ -43,6 +43,8 @@ > #define __PTHREAD_COMPAT_PADDING_MID > #define __PTHREAD_COMPAT_PADDING_END > #define __PTHREAD_MUTEX_LOCK_ELISION 0 > +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND (__WORDSIZE != 64) > +#define __PTHREAD_MUTEX_USE_UNION (__WORDSIZE != 64) > > #define __LOCK_ALIGNMENT > #define __ONCE_ALIGNMENT > diff --git a/sysdeps/x86/nptl/bits/pthreadtypes-arch.h b/sysdeps/x86/nptl/bits/pthreadtypes-arch.h > index fd86806..74d5f6d 100644 > --- a/sysdeps/x86/nptl/bits/pthreadtypes-arch.h > +++ b/sysdeps/x86/nptl/bits/pthreadtypes-arch.h > @@ -51,6 +51,13 @@ > #define __PTHREAD_COMPAT_PADDING_MID > #define __PTHREAD_COMPAT_PADDING_END > #define __PTHREAD_MUTEX_LOCK_ELISION 1 > +#ifdef __x86_64__ > +# define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 0 > +# define __PTHREAD_MUTEX_USE_UNION 0 > +#else > +# define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 1 > +# define __PTHREAD_MUTEX_USE_UNION 1 > +#endif > > #define __LOCK_ALIGNMENT > #define __ONCE_ALIGNMENT >
On Thu, Nov 2, 2017 at 5:14 AM, Adhemerval Zanella <adhemerval.zanella@linaro.org> wrote: > Ping. > > On 26/10/2017 15:14, Adhemerval Zanella wrote: >> Changes from previous version: >> >> - Fixed __nusers placement for __PTHREAD_MUTEX_NUSERS_AFTER_KIND. >> - Fixed typos. >> >> --- >> >> This patch adds two new internal defines to set the internal >> pthread_mutex_t layout required by the supported ABIS: >> >> 1. __PTHREAD_MUTEX_NUSERS_AFTER_KIND which control whether to define >> __nusers fields before or after __kind. The preferred value for >> is 0 for new ports and it sets __nusers before __kind. >> >> 2. __PTHREAD_MUTEX_USE_UNION which control whether internal __spins and >> __list members will be place inside an union for linuxthreads >> compatibility. The preferred value is 0 for ports and it sets >> to not use an union to define both fields. >> >> It fixes the wrong offsets value for __kind value on x86_64-linux-gnu-x32. >> Checked with a make check run-built-tests=no on all afected ABIs. >> >> Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org> >> >> [BZ #22298] >> * nptl/allocatestack.c (allocate_stack): Check if >> __PTHREAD_MUTEX_HAVE_PREV is non-zero, instead if >> __PTHREAD_MUTEX_HAVE_PREV is defined. >> * nptl/descr.h (pthread): Likewise. >> * nptl/nptl-init.c (__pthread_initialize_minimal_internal): >> Likewise. >> * nptl/pthread_create.c (START_THREAD_DEFN): Likewise. >> * sysdeps/nptl/fork.c (__libc_fork): Likewise. >> * sysdeps/nptl/pthread.h (PTHREAD_MUTEX_INITIALIZER): Likewise. >> * sysdeps/nptl/bits/thread-shared-types.h >> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> defines. >> (__pthread_internal_list): Check __PTHREAD_MUTEX_USE_UNION instead >> of __WORDSIZE for internal layout. >> (__pthread_mutex_s): Check __PTHREAD_MUTEX_NUSERS_AFTER_KIND instead >> of __WORDSIZE for internal __nusers layout and __PTHREAD_MUTEX_USE_UNION >> instead of __WORDSIZE whether to use an union for __spins and __list >> fields. >> (__PTHREAD_MUTEX_HAVE_PREV): Define also for __PTHREAD_MUTEX_USE_UNION >> case. >> * sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h >> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> defines. >> * sysdeps/alpha/nptl/bits/pthreadtypes-arch.h >> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> defines. >> * sysdeps/arm/nptl/bits/pthreadtypes-arch.h >> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> defines. >> * sysdeps/hppa/nptl/bits/pthreadtypes-arch.h >> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> defines. >> * sysdeps/ia64/nptl/bits/pthreadtypes-arch.h >> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> defines. >> * sysdeps/m68k/nptl/bits/pthreadtypes-arch.h >> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> defines. >> * sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h >> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> defines. >> * sysdeps/mips/nptl/bits/pthreadtypes-arch.h >> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> defines. >> * sysdeps/nios2/nptl/bits/pthreadtypes-arch.h >> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> defines. >> * sysdeps/powerpc/nptl/bits/pthreadtypes-arch.h >> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> defines. >> * sysdeps/s390/nptl/bits/pthreadtypes-arch.h >> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> defines. >> * sysdeps/sh/nptl/bits/pthreadtypes-arch.h >> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> defines. >> * sysdeps/sparc/nptl/bits/pthreadtypes-arch.h >> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> defines. >> * sysdeps/tile/nptl/bits/pthreadtypes-arch.h >> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> defines. >> * sysdeps/x86/nptl/bits/pthreadtypes-arch.h >> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> defines. >> --- >> ChangeLog | 67 ++++++++++++++++++++++++ >> nptl/allocatestack.c | 2 +- >> nptl/descr.h | 2 +- >> nptl/nptl-init.c | 2 +- >> nptl/pthread_create.c | 4 +- >> sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h | 2 + >> sysdeps/alpha/nptl/bits/pthreadtypes-arch.h | 2 + >> sysdeps/arm/nptl/bits/pthreadtypes-arch.h | 2 + >> sysdeps/hppa/nptl/bits/pthreadtypes-arch.h | 2 + >> sysdeps/ia64/nptl/bits/pthreadtypes-arch.h | 2 + >> sysdeps/m68k/nptl/bits/pthreadtypes-arch.h | 2 + >> sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h | 2 + >> sysdeps/mips/nptl/bits/pthreadtypes-arch.h | 2 + >> sysdeps/nios2/nptl/bits/pthreadtypes-arch.h | 2 + >> sysdeps/nptl/bits/thread-shared-types.h | 32 +++++++++-- >> sysdeps/nptl/fork.c | 2 +- >> sysdeps/nptl/pthread.h | 2 +- >> sysdeps/powerpc/nptl/bits/pthreadtypes-arch.h | 2 + >> sysdeps/s390/nptl/bits/pthreadtypes-arch.h | 2 + >> sysdeps/sh/nptl/bits/pthreadtypes-arch.h | 2 + >> sysdeps/sparc/nptl/bits/pthreadtypes-arch.h | 2 + >> sysdeps/tile/nptl/bits/pthreadtypes-arch.h | 2 + >> sysdeps/x86/nptl/bits/pthreadtypes-arch.h | 7 +++ >> 23 files changed, 136 insertions(+), 12 deletions(-) >> >> diff --git a/ChangeLog b/ChangeLog >> index 09e25be..203f014 100644 >> --- a/ChangeLog >> +++ b/ChangeLog >> @@ -1,5 +1,72 @@ >> 2017-10-25 Adhemerval Zanella <adhemerval.zanella@linaro.org> >> >> + [BZ #22298] >> + * nptl/allocatestack.c (allocate_stack): Check if >> + __PTHREAD_MUTEX_HAVE_PREV is non-zero, instead if >> + __PTHREAD_MUTEX_HAVE_PREV is defined. >> + * nptl/descr.h (pthread): Likewise. >> + * nptl/nptl-init.c (__pthread_initialize_minimal_internal): >> + Likewise. >> + * nptl/pthread_create.c (START_THREAD_DEFN): Likewise. >> + * sysdeps/nptl/fork.c (__libc_fork): Likewise. >> + * sysdeps/nptl/pthread.h (PTHREAD_MUTEX_INITIALIZER): Likewise. >> + * sysdeps/nptl/bits/thread-shared-types.h >> + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> + defines. >> + (__pthread_internal_list): Check __PTHREAD_MUTEX_USE_UNION instead >> + of __WORDSIZE for internal layout. >> + (__pthread_mutex_s): Check __PTHREAD_MUTEX_NUSERS_AFTER_KIND instead >> + of __WORDSIZE for internal __nusers layout and __PTHREAD_MUTEX_USE_UNION >> + instead of __WORDSIZE whether to use an union for __spins and __list >> + fields. >> + (__PTHREAD_MUTEX_HAVE_PREV): Define also for __PTHREAD_MUTEX_USE_UNION >> + case. >> + * sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h >> + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> + defines. >> + * sysdeps/alpha/nptl/bits/pthreadtypes-arch.h >> + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> + defines. >> + * sysdeps/arm/nptl/bits/pthreadtypes-arch.h >> + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> + defines. >> + * sysdeps/hppa/nptl/bits/pthreadtypes-arch.h >> + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> + defines. >> + * sysdeps/ia64/nptl/bits/pthreadtypes-arch.h >> + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> + defines. >> + * sysdeps/m68k/nptl/bits/pthreadtypes-arch.h >> + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> + defines. >> + * sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h >> + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> + defines. >> + * sysdeps/mips/nptl/bits/pthreadtypes-arch.h >> + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> + defines. >> + * sysdeps/nios2/nptl/bits/pthreadtypes-arch.h >> + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> + defines. >> + * sysdeps/powerpc/nptl/bits/pthreadtypes-arch.h >> + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> + defines. >> + * sysdeps/s390/nptl/bits/pthreadtypes-arch.h >> + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> + defines. >> + * sysdeps/sh/nptl/bits/pthreadtypes-arch.h >> + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> + defines. >> + * sysdeps/sparc/nptl/bits/pthreadtypes-arch.h >> + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> + defines. >> + * sysdeps/tile/nptl/bits/pthreadtypes-arch.h >> + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> + defines. >> + * sysdeps/x86/nptl/bits/pthreadtypes-arch.h >> + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> + defines. >> + >> * nptl/pthreadP.h (ASSERT_TYPE_SIZE, ASSERT_PTHREAD_INTERNAL_SIZE): >> New macros. >> * nptl/pthread_attr_init.c (__pthread_mutex_init): Add build time >> diff --git a/nptl/allocatestack.c b/nptl/allocatestack.c >> index ad9add8..1cc7893 100644 >> --- a/nptl/allocatestack.c >> +++ b/nptl/allocatestack.c >> @@ -753,7 +753,7 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp, >> - offsetof (pthread_mutex_t, >> __data.__list.__next)); >> pd->robust_head.list_op_pending = NULL; >> -#ifdef __PTHREAD_MUTEX_HAVE_PREV >> +#if __PTHREAD_MUTEX_HAVE_PREV >> pd->robust_prev = &pd->robust_head; >> #endif >> pd->robust_head.list = &pd->robust_head; >> diff --git a/nptl/descr.h b/nptl/descr.h >> index c5ad0c8..c83b17b 100644 >> --- a/nptl/descr.h >> +++ b/nptl/descr.h >> @@ -169,7 +169,7 @@ struct pthread >> pid_t pid_ununsed; >> >> /* List of robust mutexes the thread is holding. */ >> -#ifdef __PTHREAD_MUTEX_HAVE_PREV >> +#if __PTHREAD_MUTEX_HAVE_PREV >> void *robust_prev; >> struct robust_list_head robust_head; >> >> diff --git a/nptl/nptl-init.c b/nptl/nptl-init.c >> index 2921607..869e926 100644 >> --- a/nptl/nptl-init.c >> +++ b/nptl/nptl-init.c >> @@ -297,7 +297,7 @@ __pthread_initialize_minimal_internal (void) >> >> /* Initialize the robust mutex data. */ >> { >> -#ifdef __PTHREAD_MUTEX_HAVE_PREV >> +#if __PTHREAD_MUTEX_HAVE_PREV >> pd->robust_prev = &pd->robust_head; >> #endif >> pd->robust_head.list = &pd->robust_head; >> diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c >> index 992331e..51ae60d 100644 >> --- a/nptl/pthread_create.c >> +++ b/nptl/pthread_create.c >> @@ -518,7 +518,7 @@ START_THREAD_DEFN >> >> #ifndef __ASSUME_SET_ROBUST_LIST >> /* If this thread has any robust mutexes locked, handle them now. */ >> -# ifdef __PTHREAD_MUTEX_HAVE_PREV >> +# if __PTHREAD_MUTEX_HAVE_PREV >> void *robust = pd->robust_head.list; >> # else >> __pthread_slist_t *robust = pd->robust_list.__next; >> @@ -536,7 +536,7 @@ START_THREAD_DEFN >> __list.__next)); >> robust = *((void **) robust); >> >> -# ifdef __PTHREAD_MUTEX_HAVE_PREV >> +# if __PTHREAD_MUTEX_HAVE_PREV >> this->__list.__prev = NULL; >> # endif >> this->__list.__next = NULL; >> diff --git a/sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h b/sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h >> index d13a75d..9ab23d0 100644 >> --- a/sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h >> +++ b/sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h >> @@ -45,6 +45,8 @@ >> #define __PTHREAD_COMPAT_PADDING_MID >> #define __PTHREAD_COMPAT_PADDING_END >> #define __PTHREAD_MUTEX_LOCK_ELISION 0 >> +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 0 >> +#define __PTHREAD_MUTEX_USE_UNION 0 >> >> #define __LOCK_ALIGNMENT >> #define __ONCE_ALIGNMENT >> diff --git a/sysdeps/alpha/nptl/bits/pthreadtypes-arch.h b/sysdeps/alpha/nptl/bits/pthreadtypes-arch.h >> index b6f6cb1..429df10 100644 >> --- a/sysdeps/alpha/nptl/bits/pthreadtypes-arch.h >> +++ b/sysdeps/alpha/nptl/bits/pthreadtypes-arch.h >> @@ -33,6 +33,8 @@ >> #define __PTHREAD_COMPAT_PADDING_MID >> #define __PTHREAD_COMPAT_PADDING_END >> #define __PTHREAD_MUTEX_LOCK_ELISION 0 >> +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 0 >> +#define __PTHREAD_MUTEX_USE_UNION 0 >> >> #define __LOCK_ALIGNMENT >> #define __ONCE_ALIGNMENT >> diff --git a/sysdeps/arm/nptl/bits/pthreadtypes-arch.h b/sysdeps/arm/nptl/bits/pthreadtypes-arch.h >> index 3f9eca4..3911c81 100644 >> --- a/sysdeps/arm/nptl/bits/pthreadtypes-arch.h >> +++ b/sysdeps/arm/nptl/bits/pthreadtypes-arch.h >> @@ -34,6 +34,8 @@ >> #define __PTHREAD_COMPAT_PADDING_MID >> #define __PTHREAD_COMPAT_PADDING_END >> #define __PTHREAD_MUTEX_LOCK_ELISION 0 >> +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 1 >> +#define __PTHREAD_MUTEX_USE_UNION 1 >> >> #define __LOCK_ALIGNMENT >> #define __ONCE_ALIGNMENT >> diff --git a/sysdeps/hppa/nptl/bits/pthreadtypes-arch.h b/sysdeps/hppa/nptl/bits/pthreadtypes-arch.h >> index c158562..865a14e 100644 >> --- a/sysdeps/hppa/nptl/bits/pthreadtypes-arch.h >> +++ b/sysdeps/hppa/nptl/bits/pthreadtypes-arch.h >> @@ -48,6 +48,8 @@ >> pthread_mutex_t is larger than Linuxthreads. */ >> #define __PTHREAD_COMPAT_PADDING_END int __reserved[2]; >> #define __PTHREAD_MUTEX_LOCK_ELISION 0 >> +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 1 >> +#define __PTHREAD_MUTEX_USE_UNION 1 >> >> #define __LOCK_ALIGNMENT __attribute__ ((__aligned__(16))) >> #define __ONCE_ALIGNMENT >> diff --git a/sysdeps/ia64/nptl/bits/pthreadtypes-arch.h b/sysdeps/ia64/nptl/bits/pthreadtypes-arch.h >> index 631cb33..2a3bc75 100644 >> --- a/sysdeps/ia64/nptl/bits/pthreadtypes-arch.h >> +++ b/sysdeps/ia64/nptl/bits/pthreadtypes-arch.h >> @@ -33,6 +33,8 @@ >> #define __PTHREAD_COMPAT_PADDING_MID >> #define __PTHREAD_COMPAT_PADDING_END >> #define __PTHREAD_MUTEX_LOCK_ELISION 0 >> +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 0 >> +#define __PTHREAD_MUTEX_USE_UNION 0 >> >> #define __LOCK_ALIGNMENT >> #define __ONCE_ALIGNMENT >> diff --git a/sysdeps/m68k/nptl/bits/pthreadtypes-arch.h b/sysdeps/m68k/nptl/bits/pthreadtypes-arch.h >> index 845b9e6..966cc75 100644 >> --- a/sysdeps/m68k/nptl/bits/pthreadtypes-arch.h >> +++ b/sysdeps/m68k/nptl/bits/pthreadtypes-arch.h >> @@ -35,6 +35,8 @@ >> #define __PTHREAD_COMPAT_PADDING_MID >> #define __PTHREAD_COMPAT_PADDING_END >> #define __PTHREAD_MUTEX_LOCK_ELISION 0 >> +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 1 >> +#define __PTHREAD_MUTEX_USE_UNION 1 >> >> #define __LOCK_ALIGNMENT __attribute__ ((__aligned__ (4))) >> #define __ONCE_ALIGNMENT __attribute__ ((__aligned__ (4))) >> diff --git a/sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h b/sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h >> index d687e2c..e44f2dc 100644 >> --- a/sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h >> +++ b/sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h >> @@ -35,6 +35,8 @@ >> #define __PTHREAD_COMPAT_PADDING_MID >> #define __PTHREAD_COMPAT_PADDING_END >> #define __PTHREAD_MUTEX_LOCK_ELISION 0 >> +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 1 >> +#define __PTHREAD_MUTEX_USE_UNION 1 >> >> #define __LOCK_ALIGNMENT >> #define __ONCE_ALIGNMENT >> diff --git a/sysdeps/mips/nptl/bits/pthreadtypes-arch.h b/sysdeps/mips/nptl/bits/pthreadtypes-arch.h >> index 6aa1bda..f03389a 100644 >> --- a/sysdeps/mips/nptl/bits/pthreadtypes-arch.h >> +++ b/sysdeps/mips/nptl/bits/pthreadtypes-arch.h >> @@ -42,6 +42,8 @@ >> #define __PTHREAD_COMPAT_PADDING_MID >> #define __PTHREAD_COMPAT_PADDING_END >> #define __PTHREAD_MUTEX_LOCK_ELISION 0 >> +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND (_MIPS_SIM != _ABI64) >> +#define __PTHREAD_MUTEX_USE_UNION (_MIPS_SIM != _ABI64) >> >> #define __LOCK_ALIGNMENT >> #define __ONCE_ALIGNMENT >> diff --git a/sysdeps/nios2/nptl/bits/pthreadtypes-arch.h b/sysdeps/nios2/nptl/bits/pthreadtypes-arch.h >> index e2732f9..83f8684 100644 >> --- a/sysdeps/nios2/nptl/bits/pthreadtypes-arch.h >> +++ b/sysdeps/nios2/nptl/bits/pthreadtypes-arch.h >> @@ -35,6 +35,8 @@ >> #define __PTHREAD_COMPAT_PADDING_MID >> #define __PTHREAD_COMPAT_PADDING_END >> #define __PTHREAD_MUTEX_LOCK_ELISION 0 >> +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 1 >> +#define __PTHREAD_MUTEX_USE_UNION 1 >> >> #define __LOCK_ALIGNMENT >> #define __ONCE_ALIGNMENT >> diff --git a/sysdeps/nptl/bits/thread-shared-types.h b/sysdeps/nptl/bits/thread-shared-types.h >> index 68b82b6..da4358a 100644 >> --- a/sysdeps/nptl/bits/thread-shared-types.h >> +++ b/sysdeps/nptl/bits/thread-shared-types.h >> @@ -42,6 +42,25 @@ >> the internal structure. >> __PTHREAD_MUTEX_LOCK_ELISION - 1 if the architecture supports lock >> elision or 0 otherwise. >> + __PTHREAD_MUTEX_NUSERS_AFTER_KIND - control where to put __nusers. The >> + preferred value for new architectures >> + is 0. >> + __PTHREAD_MUTEX_USE_UNION - control whether internal __spins and >> + __list will be place inside a union for >> + linuxthreads compatibility. >> + The preferred value for new architectures >> + is 0. >> + >> + For a new port the preferred values for the required defines are: >> + >> + #define __PTHREAD_COMPAT_PADDING_MID >> + #define __PTHREAD_COMPAT_PADDING_END >> + #define __PTHREAD_MUTEX_LOCK_ELISION 0 >> + #define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 0 >> + #define __PTHREAD_MUTEX_USE_UNION 0 >> + >> + __PTHREAD_MUTEX_LOCK_ELISION can be set to 1 if the hardware plans to >> + eventually support lock elision using transactional memory. >> >> The additional macro defines any constraint for the lock alignment >> inside the thread structures: >> @@ -59,7 +78,7 @@ >> >> /* Common definition of pthread_mutex_t. */ >> >> -#if __WORDSIZE == 64 >> +#if !__PTHREAD_MUTEX_USE_UNION >> typedef struct __pthread_internal_list >> { >> struct __pthread_internal_list *__prev; >> @@ -74,7 +93,7 @@ typedef struct __pthread_internal_slist >> >> /* Lock elision support. */ >> #if __PTHREAD_MUTEX_LOCK_ELISION >> -# if __WORDSIZE == 64 >> +# if !__PTHREAD_MUTEX_USE_UNION >> # define __PTHREAD_SPINS_DATA \ >> short __spins; \ >> short __elision >> @@ -101,24 +120,27 @@ struct __pthread_mutex_s >> int __lock __LOCK_ALIGNMENT; >> unsigned int __count; >> int __owner; >> -#if __WORDSIZE == 64 >> +#if !__PTHREAD_MUTEX_NUSERS_AFTER_KIND >> unsigned int __nusers; >> #endif >> /* KIND must stay at this position in the structure to maintain >> binary compatibility with static initializers. */ >> int __kind; >> __PTHREAD_COMPAT_PADDING_MID >> -#if __WORDSIZE == 64 >> +#if __PTHREAD_MUTEX_NUSERS_AFTER_KIND >> + unsigned int __nusers; >> +#endif >> +#if !__PTHREAD_MUTEX_USE_UNION >> __PTHREAD_SPINS_DATA; >> __pthread_list_t __list; >> # define __PTHREAD_MUTEX_HAVE_PREV 1 >> #else >> - unsigned int __nusers; >> __extension__ union >> { >> __PTHREAD_SPINS_DATA; >> __pthread_slist_t __list; >> }; >> +# define __PTHREAD_MUTEX_HAVE_PREV 0 >> #endif >> __PTHREAD_COMPAT_PADDING_END >> }; >> diff --git a/sysdeps/nptl/fork.c b/sysdeps/nptl/fork.c >> index 4bb87e2..48676c2 100644 >> --- a/sysdeps/nptl/fork.c >> +++ b/sysdeps/nptl/fork.c >> @@ -166,7 +166,7 @@ __libc_fork (void) >> inherit the correct value from the parent. We do not need to clear >> the pending operation because it must have been zero when fork was >> called. */ >> -# ifdef __PTHREAD_MUTEX_HAVE_PREV >> +# if __PTHREAD_MUTEX_HAVE_PREV >> self->robust_prev = &self->robust_head; >> # endif >> self->robust_head.list = &self->robust_head; >> diff --git a/sysdeps/nptl/pthread.h b/sysdeps/nptl/pthread.h >> index 632ea7b..2b2b386 100644 >> --- a/sysdeps/nptl/pthread.h >> +++ b/sysdeps/nptl/pthread.h >> @@ -83,7 +83,7 @@ enum >> #endif >> >> >> -#ifdef __PTHREAD_MUTEX_HAVE_PREV >> +#if __PTHREAD_MUTEX_HAVE_PREV >> # define PTHREAD_MUTEX_INITIALIZER \ >> { { 0, 0, 0, 0, 0, __PTHREAD_SPINS, { 0, 0 } } } >> # ifdef __USE_GNU >> diff --git a/sysdeps/powerpc/nptl/bits/pthreadtypes-arch.h b/sysdeps/powerpc/nptl/bits/pthreadtypes-arch.h >> index f29119b..8158cb5 100644 >> --- a/sysdeps/powerpc/nptl/bits/pthreadtypes-arch.h >> +++ b/sysdeps/powerpc/nptl/bits/pthreadtypes-arch.h >> @@ -42,6 +42,8 @@ >> #define __PTHREAD_COMPAT_PADDING_MID >> #define __PTHREAD_COMPAT_PADDING_END >> #define __PTHREAD_MUTEX_LOCK_ELISION 1 >> +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND (__WORDSIZE != 64) >> +#define __PTHREAD_MUTEX_USE_UNION (__WORDSIZE != 64) >> >> #define __LOCK_ALIGNMENT >> #define __ONCE_ALIGNMENT >> diff --git a/sysdeps/s390/nptl/bits/pthreadtypes-arch.h b/sysdeps/s390/nptl/bits/pthreadtypes-arch.h >> index 3a9ac57..1ae2773 100644 >> --- a/sysdeps/s390/nptl/bits/pthreadtypes-arch.h >> +++ b/sysdeps/s390/nptl/bits/pthreadtypes-arch.h >> @@ -45,6 +45,8 @@ >> #else >> #define __PTHREAD_MUTEX_LOCK_ELISION 0 >> #endif >> +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND (__WORDSIZE != 64) >> +#define __PTHREAD_MUTEX_USE_UNION (__WORDSIZE != 64) >> >> #define __LOCK_ALIGNMENT >> #define __ONCE_ALIGNMENT >> diff --git a/sysdeps/sh/nptl/bits/pthreadtypes-arch.h b/sysdeps/sh/nptl/bits/pthreadtypes-arch.h >> index b2615fe..e707751 100644 >> --- a/sysdeps/sh/nptl/bits/pthreadtypes-arch.h >> +++ b/sysdeps/sh/nptl/bits/pthreadtypes-arch.h >> @@ -34,6 +34,8 @@ >> #define __PTHREAD_COMPAT_PADDING_MID >> #define __PTHREAD_COMPAT_PADDING_END >> #define __PTHREAD_MUTEX_LOCK_ELISION 0 >> +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 1 >> +#define __PTHREAD_MUTEX_USE_UNION 1 >> >> #define __LOCK_ALIGNMENT >> #define __ONCE_ALIGNMENT >> diff --git a/sysdeps/sparc/nptl/bits/pthreadtypes-arch.h b/sysdeps/sparc/nptl/bits/pthreadtypes-arch.h >> index 1e188cf..0f96f37 100644 >> --- a/sysdeps/sparc/nptl/bits/pthreadtypes-arch.h >> +++ b/sysdeps/sparc/nptl/bits/pthreadtypes-arch.h >> @@ -43,6 +43,8 @@ >> #define __PTHREAD_COMPAT_PADDING_MID >> #define __PTHREAD_COMPAT_PADDING_END >> #define __PTHREAD_MUTEX_LOCK_ELISION 0 >> +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND (__WORDSIZE != 64) >> +#define __PTHREAD_MUTEX_USE_UNION (__WORDSIZE != 64) >> >> #define __LOCK_ALIGNMENT >> #define __ONCE_ALIGNMENT >> diff --git a/sysdeps/tile/nptl/bits/pthreadtypes-arch.h b/sysdeps/tile/nptl/bits/pthreadtypes-arch.h >> index 145ee42..054474f 100644 >> --- a/sysdeps/tile/nptl/bits/pthreadtypes-arch.h >> +++ b/sysdeps/tile/nptl/bits/pthreadtypes-arch.h >> @@ -43,6 +43,8 @@ >> #define __PTHREAD_COMPAT_PADDING_MID >> #define __PTHREAD_COMPAT_PADDING_END >> #define __PTHREAD_MUTEX_LOCK_ELISION 0 >> +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND (__WORDSIZE != 64) >> +#define __PTHREAD_MUTEX_USE_UNION (__WORDSIZE != 64) >> >> #define __LOCK_ALIGNMENT >> #define __ONCE_ALIGNMENT >> diff --git a/sysdeps/x86/nptl/bits/pthreadtypes-arch.h b/sysdeps/x86/nptl/bits/pthreadtypes-arch.h >> index fd86806..74d5f6d 100644 >> --- a/sysdeps/x86/nptl/bits/pthreadtypes-arch.h >> +++ b/sysdeps/x86/nptl/bits/pthreadtypes-arch.h >> @@ -51,6 +51,13 @@ >> #define __PTHREAD_COMPAT_PADDING_MID >> #define __PTHREAD_COMPAT_PADDING_END >> #define __PTHREAD_MUTEX_LOCK_ELISION 1 >> +#ifdef __x86_64__ >> +# define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 0 >> +# define __PTHREAD_MUTEX_USE_UNION 0 >> +#else >> +# define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 1 >> +# define __PTHREAD_MUTEX_USE_UNION 1 >> +#endif >> >> #define __LOCK_ALIGNMENT >> #define __ONCE_ALIGNMENT >> LGTM. Thanks. -- H.J.
On Fri, Nov 3, 2017 at 8:25 AM, H.J. Lu <hjl.tools@gmail.com> wrote: > On Thu, Nov 2, 2017 at 5:14 AM, Adhemerval Zanella > <adhemerval.zanella@linaro.org> wrote: >> Ping. >> >> On 26/10/2017 15:14, Adhemerval Zanella wrote: >>> Changes from previous version: >>> >>> - Fixed __nusers placement for __PTHREAD_MUTEX_NUSERS_AFTER_KIND. >>> - Fixed typos. >>> >>> --- >>> >>> This patch adds two new internal defines to set the internal >>> pthread_mutex_t layout required by the supported ABIS: >>> >>> 1. __PTHREAD_MUTEX_NUSERS_AFTER_KIND which control whether to define >>> __nusers fields before or after __kind. The preferred value for >>> is 0 for new ports and it sets __nusers before __kind. >>> >>> 2. __PTHREAD_MUTEX_USE_UNION which control whether internal __spins and >>> __list members will be place inside an union for linuxthreads >>> compatibility. The preferred value is 0 for ports and it sets >>> to not use an union to define both fields. >>> >>> It fixes the wrong offsets value for __kind value on x86_64-linux-gnu-x32. >>> Checked with a make check run-built-tests=no on all afected ABIs. >>> >>> Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org> >>> >>> [BZ #22298] >>> * nptl/allocatestack.c (allocate_stack): Check if >>> __PTHREAD_MUTEX_HAVE_PREV is non-zero, instead if >>> __PTHREAD_MUTEX_HAVE_PREV is defined. >>> * nptl/descr.h (pthread): Likewise. >>> * nptl/nptl-init.c (__pthread_initialize_minimal_internal): >>> Likewise. >>> * nptl/pthread_create.c (START_THREAD_DEFN): Likewise. >>> * sysdeps/nptl/fork.c (__libc_fork): Likewise. >>> * sysdeps/nptl/pthread.h (PTHREAD_MUTEX_INITIALIZER): Likewise. >>> * sysdeps/nptl/bits/thread-shared-types.h >>> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >>> defines. >>> (__pthread_internal_list): Check __PTHREAD_MUTEX_USE_UNION instead >>> of __WORDSIZE for internal layout. >>> (__pthread_mutex_s): Check __PTHREAD_MUTEX_NUSERS_AFTER_KIND instead >>> of __WORDSIZE for internal __nusers layout and __PTHREAD_MUTEX_USE_UNION >>> instead of __WORDSIZE whether to use an union for __spins and __list >>> fields. >>> (__PTHREAD_MUTEX_HAVE_PREV): Define also for __PTHREAD_MUTEX_USE_UNION >>> case. >>> * sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h >>> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >>> defines. >>> * sysdeps/alpha/nptl/bits/pthreadtypes-arch.h >>> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >>> defines. >>> * sysdeps/arm/nptl/bits/pthreadtypes-arch.h >>> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >>> defines. >>> * sysdeps/hppa/nptl/bits/pthreadtypes-arch.h >>> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >>> defines. >>> * sysdeps/ia64/nptl/bits/pthreadtypes-arch.h >>> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >>> defines. >>> * sysdeps/m68k/nptl/bits/pthreadtypes-arch.h >>> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >>> defines. >>> * sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h >>> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >>> defines. >>> * sysdeps/mips/nptl/bits/pthreadtypes-arch.h >>> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >>> defines. >>> * sysdeps/nios2/nptl/bits/pthreadtypes-arch.h >>> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >>> defines. >>> * sysdeps/powerpc/nptl/bits/pthreadtypes-arch.h >>> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >>> defines. >>> * sysdeps/s390/nptl/bits/pthreadtypes-arch.h >>> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >>> defines. >>> * sysdeps/sh/nptl/bits/pthreadtypes-arch.h >>> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >>> defines. >>> * sysdeps/sparc/nptl/bits/pthreadtypes-arch.h >>> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >>> defines. >>> * sysdeps/tile/nptl/bits/pthreadtypes-arch.h >>> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >>> defines. >>> * sysdeps/x86/nptl/bits/pthreadtypes-arch.h >>> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >>> defines. > LGTM. > > Thanks. > > -- > H.J. Are you going to check in your patches to fix BZ #22298? -- H.J.
On 06/11/2017 12:18, H.J. Lu wrote: > On Fri, Nov 3, 2017 at 8:25 AM, H.J. Lu <hjl.tools@gmail.com> wrote: >> On Thu, Nov 2, 2017 at 5:14 AM, Adhemerval Zanella >> <adhemerval.zanella@linaro.org> wrote: >>> Ping. >>> >>> On 26/10/2017 15:14, Adhemerval Zanella wrote: >>>> Changes from previous version: >>>> >>>> - Fixed __nusers placement for __PTHREAD_MUTEX_NUSERS_AFTER_KIND. >>>> - Fixed typos. >>>> >>>> --- >>>> >>>> This patch adds two new internal defines to set the internal >>>> pthread_mutex_t layout required by the supported ABIS: >>>> >>>> 1. __PTHREAD_MUTEX_NUSERS_AFTER_KIND which control whether to define >>>> __nusers fields before or after __kind. The preferred value for >>>> is 0 for new ports and it sets __nusers before __kind. >>>> >>>> 2. __PTHREAD_MUTEX_USE_UNION which control whether internal __spins and >>>> __list members will be place inside an union for linuxthreads >>>> compatibility. The preferred value is 0 for ports and it sets >>>> to not use an union to define both fields. >>>> >>>> It fixes the wrong offsets value for __kind value on x86_64-linux-gnu-x32. >>>> Checked with a make check run-built-tests=no on all afected ABIs. >>>> >>>> Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org> >>>> >>>> [BZ #22298] >>>> * nptl/allocatestack.c (allocate_stack): Check if >>>> __PTHREAD_MUTEX_HAVE_PREV is non-zero, instead if >>>> __PTHREAD_MUTEX_HAVE_PREV is defined. >>>> * nptl/descr.h (pthread): Likewise. >>>> * nptl/nptl-init.c (__pthread_initialize_minimal_internal): >>>> Likewise. >>>> * nptl/pthread_create.c (START_THREAD_DEFN): Likewise. >>>> * sysdeps/nptl/fork.c (__libc_fork): Likewise. >>>> * sysdeps/nptl/pthread.h (PTHREAD_MUTEX_INITIALIZER): Likewise. >>>> * sysdeps/nptl/bits/thread-shared-types.h >>>> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >>>> defines. >>>> (__pthread_internal_list): Check __PTHREAD_MUTEX_USE_UNION instead >>>> of __WORDSIZE for internal layout. >>>> (__pthread_mutex_s): Check __PTHREAD_MUTEX_NUSERS_AFTER_KIND instead >>>> of __WORDSIZE for internal __nusers layout and __PTHREAD_MUTEX_USE_UNION >>>> instead of __WORDSIZE whether to use an union for __spins and __list >>>> fields. >>>> (__PTHREAD_MUTEX_HAVE_PREV): Define also for __PTHREAD_MUTEX_USE_UNION >>>> case. >>>> * sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h >>>> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >>>> defines. >>>> * sysdeps/alpha/nptl/bits/pthreadtypes-arch.h >>>> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >>>> defines. >>>> * sysdeps/arm/nptl/bits/pthreadtypes-arch.h >>>> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >>>> defines. >>>> * sysdeps/hppa/nptl/bits/pthreadtypes-arch.h >>>> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >>>> defines. >>>> * sysdeps/ia64/nptl/bits/pthreadtypes-arch.h >>>> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >>>> defines. >>>> * sysdeps/m68k/nptl/bits/pthreadtypes-arch.h >>>> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >>>> defines. >>>> * sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h >>>> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >>>> defines. >>>> * sysdeps/mips/nptl/bits/pthreadtypes-arch.h >>>> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >>>> defines. >>>> * sysdeps/nios2/nptl/bits/pthreadtypes-arch.h >>>> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >>>> defines. >>>> * sysdeps/powerpc/nptl/bits/pthreadtypes-arch.h >>>> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >>>> defines. >>>> * sysdeps/s390/nptl/bits/pthreadtypes-arch.h >>>> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >>>> defines. >>>> * sysdeps/sh/nptl/bits/pthreadtypes-arch.h >>>> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >>>> defines. >>>> * sysdeps/sparc/nptl/bits/pthreadtypes-arch.h >>>> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >>>> defines. >>>> * sysdeps/tile/nptl/bits/pthreadtypes-arch.h >>>> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >>>> defines. >>>> * sysdeps/x86/nptl/bits/pthreadtypes-arch.h >>>> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >>>> defines. > >> LGTM. >> >> Thanks. >> >> -- >> H.J. > > Are you going to check in your patches to fix BZ #22298? > I think the onyl missing point for the patchset was Florian said he need to double-check the coverage is adequate [1]. [1] https://sourceware.org/ml/libc-alpha/2017-11/msg00046.html
On 11/06/2017 03:59 PM, Adhemerval Zanella wrote: > I think the onyl missing point for the patchset was Florian said > he need to double-check the coverage is adequate [1]. I'm going to double-check that now. Thanks, Florian
diff --git a/ChangeLog b/ChangeLog index 09e25be..203f014 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,72 @@ 2017-10-25 Adhemerval Zanella <adhemerval.zanella@linaro.org> + [BZ #22298] + * nptl/allocatestack.c (allocate_stack): Check if + __PTHREAD_MUTEX_HAVE_PREV is non-zero, instead if + __PTHREAD_MUTEX_HAVE_PREV is defined. + * nptl/descr.h (pthread): Likewise. + * nptl/nptl-init.c (__pthread_initialize_minimal_internal): + Likewise. + * nptl/pthread_create.c (START_THREAD_DEFN): Likewise. + * sysdeps/nptl/fork.c (__libc_fork): Likewise. + * sysdeps/nptl/pthread.h (PTHREAD_MUTEX_INITIALIZER): Likewise. + * sysdeps/nptl/bits/thread-shared-types.h + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New + defines. + (__pthread_internal_list): Check __PTHREAD_MUTEX_USE_UNION instead + of __WORDSIZE for internal layout. + (__pthread_mutex_s): Check __PTHREAD_MUTEX_NUSERS_AFTER_KIND instead + of __WORDSIZE for internal __nusers layout and __PTHREAD_MUTEX_USE_UNION + instead of __WORDSIZE whether to use an union for __spins and __list + fields. + (__PTHREAD_MUTEX_HAVE_PREV): Define also for __PTHREAD_MUTEX_USE_UNION + case. + * sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New + defines. + * sysdeps/alpha/nptl/bits/pthreadtypes-arch.h + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New + defines. + * sysdeps/arm/nptl/bits/pthreadtypes-arch.h + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New + defines. + * sysdeps/hppa/nptl/bits/pthreadtypes-arch.h + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New + defines. + * sysdeps/ia64/nptl/bits/pthreadtypes-arch.h + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New + defines. + * sysdeps/m68k/nptl/bits/pthreadtypes-arch.h + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New + defines. + * sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New + defines. + * sysdeps/mips/nptl/bits/pthreadtypes-arch.h + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New + defines. + * sysdeps/nios2/nptl/bits/pthreadtypes-arch.h + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New + defines. + * sysdeps/powerpc/nptl/bits/pthreadtypes-arch.h + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New + defines. + * sysdeps/s390/nptl/bits/pthreadtypes-arch.h + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New + defines. + * sysdeps/sh/nptl/bits/pthreadtypes-arch.h + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New + defines. + * sysdeps/sparc/nptl/bits/pthreadtypes-arch.h + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New + defines. + * sysdeps/tile/nptl/bits/pthreadtypes-arch.h + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New + defines. + * sysdeps/x86/nptl/bits/pthreadtypes-arch.h + (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New + defines. + * nptl/pthreadP.h (ASSERT_TYPE_SIZE, ASSERT_PTHREAD_INTERNAL_SIZE): New macros. * nptl/pthread_attr_init.c (__pthread_mutex_init): Add build time diff --git a/nptl/allocatestack.c b/nptl/allocatestack.c index ad9add8..1cc7893 100644 --- a/nptl/allocatestack.c +++ b/nptl/allocatestack.c @@ -753,7 +753,7 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp, - offsetof (pthread_mutex_t, __data.__list.__next)); pd->robust_head.list_op_pending = NULL; -#ifdef __PTHREAD_MUTEX_HAVE_PREV +#if __PTHREAD_MUTEX_HAVE_PREV pd->robust_prev = &pd->robust_head; #endif pd->robust_head.list = &pd->robust_head; diff --git a/nptl/descr.h b/nptl/descr.h index c5ad0c8..c83b17b 100644 --- a/nptl/descr.h +++ b/nptl/descr.h @@ -169,7 +169,7 @@ struct pthread pid_t pid_ununsed; /* List of robust mutexes the thread is holding. */ -#ifdef __PTHREAD_MUTEX_HAVE_PREV +#if __PTHREAD_MUTEX_HAVE_PREV void *robust_prev; struct robust_list_head robust_head; diff --git a/nptl/nptl-init.c b/nptl/nptl-init.c index 2921607..869e926 100644 --- a/nptl/nptl-init.c +++ b/nptl/nptl-init.c @@ -297,7 +297,7 @@ __pthread_initialize_minimal_internal (void) /* Initialize the robust mutex data. */ { -#ifdef __PTHREAD_MUTEX_HAVE_PREV +#if __PTHREAD_MUTEX_HAVE_PREV pd->robust_prev = &pd->robust_head; #endif pd->robust_head.list = &pd->robust_head; diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c index 992331e..51ae60d 100644 --- a/nptl/pthread_create.c +++ b/nptl/pthread_create.c @@ -518,7 +518,7 @@ START_THREAD_DEFN #ifndef __ASSUME_SET_ROBUST_LIST /* If this thread has any robust mutexes locked, handle them now. */ -# ifdef __PTHREAD_MUTEX_HAVE_PREV +# if __PTHREAD_MUTEX_HAVE_PREV void *robust = pd->robust_head.list; # else __pthread_slist_t *robust = pd->robust_list.__next; @@ -536,7 +536,7 @@ START_THREAD_DEFN __list.__next)); robust = *((void **) robust); -# ifdef __PTHREAD_MUTEX_HAVE_PREV +# if __PTHREAD_MUTEX_HAVE_PREV this->__list.__prev = NULL; # endif this->__list.__next = NULL; diff --git a/sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h b/sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h index d13a75d..9ab23d0 100644 --- a/sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h +++ b/sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h @@ -45,6 +45,8 @@ #define __PTHREAD_COMPAT_PADDING_MID #define __PTHREAD_COMPAT_PADDING_END #define __PTHREAD_MUTEX_LOCK_ELISION 0 +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 0 +#define __PTHREAD_MUTEX_USE_UNION 0 #define __LOCK_ALIGNMENT #define __ONCE_ALIGNMENT diff --git a/sysdeps/alpha/nptl/bits/pthreadtypes-arch.h b/sysdeps/alpha/nptl/bits/pthreadtypes-arch.h index b6f6cb1..429df10 100644 --- a/sysdeps/alpha/nptl/bits/pthreadtypes-arch.h +++ b/sysdeps/alpha/nptl/bits/pthreadtypes-arch.h @@ -33,6 +33,8 @@ #define __PTHREAD_COMPAT_PADDING_MID #define __PTHREAD_COMPAT_PADDING_END #define __PTHREAD_MUTEX_LOCK_ELISION 0 +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 0 +#define __PTHREAD_MUTEX_USE_UNION 0 #define __LOCK_ALIGNMENT #define __ONCE_ALIGNMENT diff --git a/sysdeps/arm/nptl/bits/pthreadtypes-arch.h b/sysdeps/arm/nptl/bits/pthreadtypes-arch.h index 3f9eca4..3911c81 100644 --- a/sysdeps/arm/nptl/bits/pthreadtypes-arch.h +++ b/sysdeps/arm/nptl/bits/pthreadtypes-arch.h @@ -34,6 +34,8 @@ #define __PTHREAD_COMPAT_PADDING_MID #define __PTHREAD_COMPAT_PADDING_END #define __PTHREAD_MUTEX_LOCK_ELISION 0 +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 1 +#define __PTHREAD_MUTEX_USE_UNION 1 #define __LOCK_ALIGNMENT #define __ONCE_ALIGNMENT diff --git a/sysdeps/hppa/nptl/bits/pthreadtypes-arch.h b/sysdeps/hppa/nptl/bits/pthreadtypes-arch.h index c158562..865a14e 100644 --- a/sysdeps/hppa/nptl/bits/pthreadtypes-arch.h +++ b/sysdeps/hppa/nptl/bits/pthreadtypes-arch.h @@ -48,6 +48,8 @@ pthread_mutex_t is larger than Linuxthreads. */ #define __PTHREAD_COMPAT_PADDING_END int __reserved[2]; #define __PTHREAD_MUTEX_LOCK_ELISION 0 +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 1 +#define __PTHREAD_MUTEX_USE_UNION 1 #define __LOCK_ALIGNMENT __attribute__ ((__aligned__(16))) #define __ONCE_ALIGNMENT diff --git a/sysdeps/ia64/nptl/bits/pthreadtypes-arch.h b/sysdeps/ia64/nptl/bits/pthreadtypes-arch.h index 631cb33..2a3bc75 100644 --- a/sysdeps/ia64/nptl/bits/pthreadtypes-arch.h +++ b/sysdeps/ia64/nptl/bits/pthreadtypes-arch.h @@ -33,6 +33,8 @@ #define __PTHREAD_COMPAT_PADDING_MID #define __PTHREAD_COMPAT_PADDING_END #define __PTHREAD_MUTEX_LOCK_ELISION 0 +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 0 +#define __PTHREAD_MUTEX_USE_UNION 0 #define __LOCK_ALIGNMENT #define __ONCE_ALIGNMENT diff --git a/sysdeps/m68k/nptl/bits/pthreadtypes-arch.h b/sysdeps/m68k/nptl/bits/pthreadtypes-arch.h index 845b9e6..966cc75 100644 --- a/sysdeps/m68k/nptl/bits/pthreadtypes-arch.h +++ b/sysdeps/m68k/nptl/bits/pthreadtypes-arch.h @@ -35,6 +35,8 @@ #define __PTHREAD_COMPAT_PADDING_MID #define __PTHREAD_COMPAT_PADDING_END #define __PTHREAD_MUTEX_LOCK_ELISION 0 +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 1 +#define __PTHREAD_MUTEX_USE_UNION 1 #define __LOCK_ALIGNMENT __attribute__ ((__aligned__ (4))) #define __ONCE_ALIGNMENT __attribute__ ((__aligned__ (4))) diff --git a/sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h b/sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h index d687e2c..e44f2dc 100644 --- a/sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h +++ b/sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h @@ -35,6 +35,8 @@ #define __PTHREAD_COMPAT_PADDING_MID #define __PTHREAD_COMPAT_PADDING_END #define __PTHREAD_MUTEX_LOCK_ELISION 0 +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 1 +#define __PTHREAD_MUTEX_USE_UNION 1 #define __LOCK_ALIGNMENT #define __ONCE_ALIGNMENT diff --git a/sysdeps/mips/nptl/bits/pthreadtypes-arch.h b/sysdeps/mips/nptl/bits/pthreadtypes-arch.h index 6aa1bda..f03389a 100644 --- a/sysdeps/mips/nptl/bits/pthreadtypes-arch.h +++ b/sysdeps/mips/nptl/bits/pthreadtypes-arch.h @@ -42,6 +42,8 @@ #define __PTHREAD_COMPAT_PADDING_MID #define __PTHREAD_COMPAT_PADDING_END #define __PTHREAD_MUTEX_LOCK_ELISION 0 +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND (_MIPS_SIM != _ABI64) +#define __PTHREAD_MUTEX_USE_UNION (_MIPS_SIM != _ABI64) #define __LOCK_ALIGNMENT #define __ONCE_ALIGNMENT diff --git a/sysdeps/nios2/nptl/bits/pthreadtypes-arch.h b/sysdeps/nios2/nptl/bits/pthreadtypes-arch.h index e2732f9..83f8684 100644 --- a/sysdeps/nios2/nptl/bits/pthreadtypes-arch.h +++ b/sysdeps/nios2/nptl/bits/pthreadtypes-arch.h @@ -35,6 +35,8 @@ #define __PTHREAD_COMPAT_PADDING_MID #define __PTHREAD_COMPAT_PADDING_END #define __PTHREAD_MUTEX_LOCK_ELISION 0 +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 1 +#define __PTHREAD_MUTEX_USE_UNION 1 #define __LOCK_ALIGNMENT #define __ONCE_ALIGNMENT diff --git a/sysdeps/nptl/bits/thread-shared-types.h b/sysdeps/nptl/bits/thread-shared-types.h index 68b82b6..da4358a 100644 --- a/sysdeps/nptl/bits/thread-shared-types.h +++ b/sysdeps/nptl/bits/thread-shared-types.h @@ -42,6 +42,25 @@ the internal structure. __PTHREAD_MUTEX_LOCK_ELISION - 1 if the architecture supports lock elision or 0 otherwise. + __PTHREAD_MUTEX_NUSERS_AFTER_KIND - control where to put __nusers. The + preferred value for new architectures + is 0. + __PTHREAD_MUTEX_USE_UNION - control whether internal __spins and + __list will be place inside a union for + linuxthreads compatibility. + The preferred value for new architectures + is 0. + + For a new port the preferred values for the required defines are: + + #define __PTHREAD_COMPAT_PADDING_MID + #define __PTHREAD_COMPAT_PADDING_END + #define __PTHREAD_MUTEX_LOCK_ELISION 0 + #define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 0 + #define __PTHREAD_MUTEX_USE_UNION 0 + + __PTHREAD_MUTEX_LOCK_ELISION can be set to 1 if the hardware plans to + eventually support lock elision using transactional memory. The additional macro defines any constraint for the lock alignment inside the thread structures: @@ -59,7 +78,7 @@ /* Common definition of pthread_mutex_t. */ -#if __WORDSIZE == 64 +#if !__PTHREAD_MUTEX_USE_UNION typedef struct __pthread_internal_list { struct __pthread_internal_list *__prev; @@ -74,7 +93,7 @@ typedef struct __pthread_internal_slist /* Lock elision support. */ #if __PTHREAD_MUTEX_LOCK_ELISION -# if __WORDSIZE == 64 +# if !__PTHREAD_MUTEX_USE_UNION # define __PTHREAD_SPINS_DATA \ short __spins; \ short __elision @@ -101,24 +120,27 @@ struct __pthread_mutex_s int __lock __LOCK_ALIGNMENT; unsigned int __count; int __owner; -#if __WORDSIZE == 64 +#if !__PTHREAD_MUTEX_NUSERS_AFTER_KIND unsigned int __nusers; #endif /* KIND must stay at this position in the structure to maintain binary compatibility with static initializers. */ int __kind; __PTHREAD_COMPAT_PADDING_MID -#if __WORDSIZE == 64 +#if __PTHREAD_MUTEX_NUSERS_AFTER_KIND + unsigned int __nusers; +#endif +#if !__PTHREAD_MUTEX_USE_UNION __PTHREAD_SPINS_DATA; __pthread_list_t __list; # define __PTHREAD_MUTEX_HAVE_PREV 1 #else - unsigned int __nusers; __extension__ union { __PTHREAD_SPINS_DATA; __pthread_slist_t __list; }; +# define __PTHREAD_MUTEX_HAVE_PREV 0 #endif __PTHREAD_COMPAT_PADDING_END }; diff --git a/sysdeps/nptl/fork.c b/sysdeps/nptl/fork.c index 4bb87e2..48676c2 100644 --- a/sysdeps/nptl/fork.c +++ b/sysdeps/nptl/fork.c @@ -166,7 +166,7 @@ __libc_fork (void) inherit the correct value from the parent. We do not need to clear the pending operation because it must have been zero when fork was called. */ -# ifdef __PTHREAD_MUTEX_HAVE_PREV +# if __PTHREAD_MUTEX_HAVE_PREV self->robust_prev = &self->robust_head; # endif self->robust_head.list = &self->robust_head; diff --git a/sysdeps/nptl/pthread.h b/sysdeps/nptl/pthread.h index 632ea7b..2b2b386 100644 --- a/sysdeps/nptl/pthread.h +++ b/sysdeps/nptl/pthread.h @@ -83,7 +83,7 @@ enum #endif -#ifdef __PTHREAD_MUTEX_HAVE_PREV +#if __PTHREAD_MUTEX_HAVE_PREV # define PTHREAD_MUTEX_INITIALIZER \ { { 0, 0, 0, 0, 0, __PTHREAD_SPINS, { 0, 0 } } } # ifdef __USE_GNU diff --git a/sysdeps/powerpc/nptl/bits/pthreadtypes-arch.h b/sysdeps/powerpc/nptl/bits/pthreadtypes-arch.h index f29119b..8158cb5 100644 --- a/sysdeps/powerpc/nptl/bits/pthreadtypes-arch.h +++ b/sysdeps/powerpc/nptl/bits/pthreadtypes-arch.h @@ -42,6 +42,8 @@ #define __PTHREAD_COMPAT_PADDING_MID #define __PTHREAD_COMPAT_PADDING_END #define __PTHREAD_MUTEX_LOCK_ELISION 1 +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND (__WORDSIZE != 64) +#define __PTHREAD_MUTEX_USE_UNION (__WORDSIZE != 64) #define __LOCK_ALIGNMENT #define __ONCE_ALIGNMENT diff --git a/sysdeps/s390/nptl/bits/pthreadtypes-arch.h b/sysdeps/s390/nptl/bits/pthreadtypes-arch.h index 3a9ac57..1ae2773 100644 --- a/sysdeps/s390/nptl/bits/pthreadtypes-arch.h +++ b/sysdeps/s390/nptl/bits/pthreadtypes-arch.h @@ -45,6 +45,8 @@ #else #define __PTHREAD_MUTEX_LOCK_ELISION 0 #endif +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND (__WORDSIZE != 64) +#define __PTHREAD_MUTEX_USE_UNION (__WORDSIZE != 64) #define __LOCK_ALIGNMENT #define __ONCE_ALIGNMENT diff --git a/sysdeps/sh/nptl/bits/pthreadtypes-arch.h b/sysdeps/sh/nptl/bits/pthreadtypes-arch.h index b2615fe..e707751 100644 --- a/sysdeps/sh/nptl/bits/pthreadtypes-arch.h +++ b/sysdeps/sh/nptl/bits/pthreadtypes-arch.h @@ -34,6 +34,8 @@ #define __PTHREAD_COMPAT_PADDING_MID #define __PTHREAD_COMPAT_PADDING_END #define __PTHREAD_MUTEX_LOCK_ELISION 0 +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 1 +#define __PTHREAD_MUTEX_USE_UNION 1 #define __LOCK_ALIGNMENT #define __ONCE_ALIGNMENT diff --git a/sysdeps/sparc/nptl/bits/pthreadtypes-arch.h b/sysdeps/sparc/nptl/bits/pthreadtypes-arch.h index 1e188cf..0f96f37 100644 --- a/sysdeps/sparc/nptl/bits/pthreadtypes-arch.h +++ b/sysdeps/sparc/nptl/bits/pthreadtypes-arch.h @@ -43,6 +43,8 @@ #define __PTHREAD_COMPAT_PADDING_MID #define __PTHREAD_COMPAT_PADDING_END #define __PTHREAD_MUTEX_LOCK_ELISION 0 +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND (__WORDSIZE != 64) +#define __PTHREAD_MUTEX_USE_UNION (__WORDSIZE != 64) #define __LOCK_ALIGNMENT #define __ONCE_ALIGNMENT diff --git a/sysdeps/tile/nptl/bits/pthreadtypes-arch.h b/sysdeps/tile/nptl/bits/pthreadtypes-arch.h index 145ee42..054474f 100644 --- a/sysdeps/tile/nptl/bits/pthreadtypes-arch.h +++ b/sysdeps/tile/nptl/bits/pthreadtypes-arch.h @@ -43,6 +43,8 @@ #define __PTHREAD_COMPAT_PADDING_MID #define __PTHREAD_COMPAT_PADDING_END #define __PTHREAD_MUTEX_LOCK_ELISION 0 +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND (__WORDSIZE != 64) +#define __PTHREAD_MUTEX_USE_UNION (__WORDSIZE != 64) #define __LOCK_ALIGNMENT #define __ONCE_ALIGNMENT diff --git a/sysdeps/x86/nptl/bits/pthreadtypes-arch.h b/sysdeps/x86/nptl/bits/pthreadtypes-arch.h index fd86806..74d5f6d 100644 --- a/sysdeps/x86/nptl/bits/pthreadtypes-arch.h +++ b/sysdeps/x86/nptl/bits/pthreadtypes-arch.h @@ -51,6 +51,13 @@ #define __PTHREAD_COMPAT_PADDING_MID #define __PTHREAD_COMPAT_PADDING_END #define __PTHREAD_MUTEX_LOCK_ELISION 1 +#ifdef __x86_64__ +# define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 0 +# define __PTHREAD_MUTEX_USE_UNION 0 +#else +# define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 1 +# define __PTHREAD_MUTEX_USE_UNION 1 +#endif #define __LOCK_ALIGNMENT #define __ONCE_ALIGNMENT
Changes from previous version: - Fixed __nusers placement for __PTHREAD_MUTEX_NUSERS_AFTER_KIND. - Fixed typos. --- This patch adds two new internal defines to set the internal pthread_mutex_t layout required by the supported ABIS: 1. __PTHREAD_MUTEX_NUSERS_AFTER_KIND which control whether to define __nusers fields before or after __kind. The preferred value for is 0 for new ports and it sets __nusers before __kind. 2. __PTHREAD_MUTEX_USE_UNION which control whether internal __spins and __list members will be place inside an union for linuxthreads compatibility. The preferred value is 0 for ports and it sets to not use an union to define both fields. It fixes the wrong offsets value for __kind value on x86_64-linux-gnu-x32. Checked with a make check run-built-tests=no on all afected ABIs. Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org> [BZ #22298] * nptl/allocatestack.c (allocate_stack): Check if __PTHREAD_MUTEX_HAVE_PREV is non-zero, instead if __PTHREAD_MUTEX_HAVE_PREV is defined. * nptl/descr.h (pthread): Likewise. * nptl/nptl-init.c (__pthread_initialize_minimal_internal): Likewise. * nptl/pthread_create.c (START_THREAD_DEFN): Likewise. * sysdeps/nptl/fork.c (__libc_fork): Likewise. * sysdeps/nptl/pthread.h (PTHREAD_MUTEX_INITIALIZER): Likewise. * sysdeps/nptl/bits/thread-shared-types.h (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New defines. (__pthread_internal_list): Check __PTHREAD_MUTEX_USE_UNION instead of __WORDSIZE for internal layout. (__pthread_mutex_s): Check __PTHREAD_MUTEX_NUSERS_AFTER_KIND instead of __WORDSIZE for internal __nusers layout and __PTHREAD_MUTEX_USE_UNION instead of __WORDSIZE whether to use an union for __spins and __list fields. (__PTHREAD_MUTEX_HAVE_PREV): Define also for __PTHREAD_MUTEX_USE_UNION case. * sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New defines. * sysdeps/alpha/nptl/bits/pthreadtypes-arch.h (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New defines. * sysdeps/arm/nptl/bits/pthreadtypes-arch.h (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New defines. * sysdeps/hppa/nptl/bits/pthreadtypes-arch.h (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New defines. * sysdeps/ia64/nptl/bits/pthreadtypes-arch.h (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New defines. * sysdeps/m68k/nptl/bits/pthreadtypes-arch.h (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New defines. * sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New defines. * sysdeps/mips/nptl/bits/pthreadtypes-arch.h (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New defines. * sysdeps/nios2/nptl/bits/pthreadtypes-arch.h (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New defines. * sysdeps/powerpc/nptl/bits/pthreadtypes-arch.h (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New defines. * sysdeps/s390/nptl/bits/pthreadtypes-arch.h (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New defines. * sysdeps/sh/nptl/bits/pthreadtypes-arch.h (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New defines. * sysdeps/sparc/nptl/bits/pthreadtypes-arch.h (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New defines. * sysdeps/tile/nptl/bits/pthreadtypes-arch.h (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New defines. * sysdeps/x86/nptl/bits/pthreadtypes-arch.h (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New defines. --- ChangeLog | 67 ++++++++++++++++++++++++ nptl/allocatestack.c | 2 +- nptl/descr.h | 2 +- nptl/nptl-init.c | 2 +- nptl/pthread_create.c | 4 +- sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h | 2 + sysdeps/alpha/nptl/bits/pthreadtypes-arch.h | 2 + sysdeps/arm/nptl/bits/pthreadtypes-arch.h | 2 + sysdeps/hppa/nptl/bits/pthreadtypes-arch.h | 2 + sysdeps/ia64/nptl/bits/pthreadtypes-arch.h | 2 + sysdeps/m68k/nptl/bits/pthreadtypes-arch.h | 2 + sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h | 2 + sysdeps/mips/nptl/bits/pthreadtypes-arch.h | 2 + sysdeps/nios2/nptl/bits/pthreadtypes-arch.h | 2 + sysdeps/nptl/bits/thread-shared-types.h | 32 +++++++++-- sysdeps/nptl/fork.c | 2 +- sysdeps/nptl/pthread.h | 2 +- sysdeps/powerpc/nptl/bits/pthreadtypes-arch.h | 2 + sysdeps/s390/nptl/bits/pthreadtypes-arch.h | 2 + sysdeps/sh/nptl/bits/pthreadtypes-arch.h | 2 + sysdeps/sparc/nptl/bits/pthreadtypes-arch.h | 2 + sysdeps/tile/nptl/bits/pthreadtypes-arch.h | 2 + sysdeps/x86/nptl/bits/pthreadtypes-arch.h | 7 +++ 23 files changed, 136 insertions(+), 12 deletions(-) -- 2.7.4