This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Correct mutex type check for disable lock elision via pthread_mutexattr_settype call


On Tue, Apr 01, 2014 at 10:29:32AM +0200, Stefan Liebler wrote:
> Hi,
> 
> if glibc is build with --enable-lock-elision=yes,
> all default mutexes are elided (only for supported architectures).
> Someone can disable the elision for one specific mutex with
> a call to pthread_mutexattr_settype.
> Currently you can specify either PTHREAD_MUTEX_NORMAL or
> PTHREAD_MUTEX_DEFAULT, because they are both defined to 0.
> The function checks for type PTHREAD_MUTEX_DEFAULT
> and then disables elision.
> 
> For correctness, the function should check against PTHREAD_MUTEX_NORMAL!
> According to POSIX, PTHREAD_MUTEX_NORMAL shall deadlock if a thread
> tries to relock a mutex without first unlocking it.
> In case of PTHREAD_MUTEX_DEFAULT, the behavior is undefined.
> Thus the mutex can be elided with PTHREAD_MUTEX_DEFAULT, but not
> with PTHREAD_MUTEX_NORMAL.
> The same can be read in the lock elision implementation guidelines
> (https://sourceware.org/glibc/wiki/LockElisionGuide).
> 
> Bye.
> 
> ---
> 2014-04-01  Stefan Liebler  <stli@linux.vnet.ibm.com>
> 
> 	* nptl/pthread_mutexattr_settype.c
> 	(__pthread_mutexattr_settype):
> 	Disable lock elision for PTHREAD_MUTEX_NORMAL.
> ---

> diff --git a/nptl/pthread_mutexattr_settype.c b/nptl/pthread_mutexattr_settype.c
> index 0e91292..cf648cf 100644
> --- a/nptl/pthread_mutexattr_settype.c
> +++ b/nptl/pthread_mutexattr_settype.c
> @@ -32,7 +32,7 @@ __pthread_mutexattr_settype (attr, kind)
>  
>    /* Cannot distinguish between DEFAULT and NORMAL. So any settype
>       call disables elision for now.  */
> -  if (kind == PTHREAD_MUTEX_DEFAULT)
> +  if (kind == PTHREAD_MUTEX_NORMAL)
>      kind |= PTHREAD_MUTEX_NO_ELISION_NP;
>  
>    iattr = (struct pthread_mutexattr *) attr;

Looks ok.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]