[PATCH] Add runtime check if mutex will be elided in tst-mutex8 testcases.
Stefan Liebler
stli@linux.vnet.ibm.com
Fri Feb 16 16:47:00 GMT 2018
On 02/15/2018 08:50 PM, Carlos O'Donell wrote:
> On 02/05/2018 10:41 PM, Stefan Liebler wrote:
>> Hi,
>>
>> An elided mutex don't fail destroy. Elision was disabled for the
>> test nptl/tst-mutex8 in nptl/Makefile. Thus we can run tests which
>> destroy a locked mutex.
>>
>> As elision is only disabled for tst-mutex8, the variants
>> tst-mutex8-static, tst-mutexpi8 and tst-mutexpi8-static are still
>> failing if lock elision is enabled.
>>
>> This patch adds a runtime check, if the checked type of mutex will
>> be elided. This check is using TUNABLE_GET_FULL to determine if
>> elision is enabled via the tunables framework.
>> The pthread_mutex_destroy tests are only run if we dont't assume an
>> elided mutex.
>>
>> This way, we can run the whole glibc testsuite with or without enabled
>> lock elision.
>>
>> Okay to commit?
>
> LGTM.
Thanks.
Committed.
>
> Reviewed-by: Carlos O'Donell <carlos@redhat.com>
>
>> Bye
>> Stefan
>>
>> ChangeLog:
>>
>>     * nptl/Makefile (tst-mutex8-ENV): Delete.
>>     * nptl/tst-mutex8.c (check_type):
>>     Add runtime check if mutex will be elided.
>>
>> 20180205_tstmutex8_elision.patch
>>
>>
>> commit eb4c91a86de283ff314c068d9d89368b229b9a33
>> Author: Stefan Liebler <stli@linux.vnet.ibm.com>
>> Date: Mon Feb 5 09:16:14 2018 +0000
>>
>> Add runtime check if mutex will be elided in tst-mutex8 testcases.
>>
>> An elided mutex don't fail destroy. Elision was disabled for the
>> test nptl/tst-mutex8 in nptl/Makefile. Thus we can run tests which
>> destroy a locked mutex.
>>
>> As elision is only disabled for tst-mutex8, the variants
>> tst-mutex8-static, tst-mutexpi8 and tst-mutexpi8-static are still
>> failing if lock elision is enabled.
>>
>> This patch adds a runtime check, if the checked type of mutex will
>> be elided. This check is using TUNABLE_GET_FULL to determine if
>> elision is enabled via the tunables framework.
>> The pthread_mutex_destroy tests are only run if we dont't assume an
>> elided mutex.
>>
>> This way, we can run the whole glibc testsuite with or without enabled
>> lock elision.
>>
>> ChangeLog:
>>
>> * nptl/Makefile (tst-mutex8-ENV): Delete.
>> * nptl/tst-mutex8.c (check_type):
>> Add runtime check if mutex will be elided.
>>
>> diff --git a/nptl/Makefile b/nptl/Makefile
>> index 6fc2c8bb6a..9340f9f699 100644
>> --- a/nptl/Makefile
>> +++ b/nptl/Makefile
>> @@ -726,10 +726,6 @@ endif
>>
>> $(objpfx)tst-compat-forwarder: $(objpfx)tst-compat-forwarder-mod.so
>>
>> -# Disable elision for tst-mutex8 so it can verify error case for
>> -# destroying a mutex.
>> -tst-mutex8-ENV = GLIBC_TUNABLES=glibc.elision.enable=0
>> -
>
> OK.
>
>> # The tests here better do not run in parallel
>> ifneq ($(filter %tests,$(MAKECMDGOALS)),)
>> .NOTPARALLEL:
>> diff --git a/nptl/tst-mutex8.c b/nptl/tst-mutex8.c
>> index 516ef3809e..d31f342751 100644
>> --- a/nptl/tst-mutex8.c
>> +++ b/nptl/tst-mutex8.c
>> @@ -22,7 +22,8 @@
>> #include <stdbool.h>
>> #include <stdio.h>
>> #include <stdlib.h>
>> -
>> +#include <unistd.h>
>> +#include <elf/dl-tunables.h>
>
> OK.
>
>>
>> static pthread_mutex_t *m;
>> static pthread_barrier_t b;
>> @@ -95,6 +96,30 @@ check_type (const char *mas, pthread_mutexattr_t *ma)
>> {
>> int e;
>>
>> + /* Check if a mutex will be elided. Lock elision can only be activated via
>> + the tunables framework. By default, lock elision is disabled. */
>> + bool assume_elided_mutex = false;
>> +#if HAVE_TUNABLES
>> + int ma_type = PTHREAD_MUTEX_TIMED_NP;
>> + if (ma != NULL)
>> + {
>> + e = pthread_mutexattr_gettype (ma, &ma_type);
>> + if (e != 0)
>> + {
>> + printf ("pthread_mutexattr_gettype failed with %d (%m)\n", e);
>> + return 1;
>> + }
>> + }
>> + if (ma_type == PTHREAD_MUTEX_TIMED_NP)
>> + {
>> + /* This type of mutex can be elided if elision is enabled via the tunables
>> + framework. Some tests below are failing if the mutex is elided.
>> + Thus we only run those if we assume that the mutex won't be elided. */
>> + if (TUNABLE_GET_FULL (glibc, elision, enable, int32_t, NULL) == 1)
>> + assume_elided_mutex = true;
>> + }
>> +#endif
>
> OK.
>
>> +
>> e = pthread_mutex_init (m, ma);
>> if (e != 0)
>> {
>> @@ -127,19 +152,23 @@ check_type (const char *mas, pthread_mutexattr_t *ma)
>> return 1;
>> }
>>
>> - /* Elided mutexes don't fail destroy, but this test is run with
>> - elision disabled so we can test them. */
>> - e = pthread_mutex_destroy (m);
>> - if (e == 0)
>> + /* Elided mutexes don't fail destroy, thus only test this if we don't assume
>> + elision. */
>> + if (assume_elided_mutex == false)
>> {
>> - printf ("mutex_destroy of self-locked mutex succeeded for %s\n", mas);
>> - return 1;
>> - }
>> - if (e != EBUSY)
>> - {
>> - printf ("mutex_destroy of self-locked mutex did not return EBUSY %s\n",
>> - mas);
>> - return 1;
>> + e = pthread_mutex_destroy (m);
>> + if (e == 0)
>> + {
>> + printf ("mutex_destroy of self-locked mutex succeeded for %s\n", mas);
>> + return 1;
>> + }
>> + if (e != EBUSY)
>> + {
>> + printf ("\
>> +mutex_destroy of self-locked mutex did not return EBUSY %s\n",
>> + mas);
>> + return 1;
>> + }
>
> OK.
>
>> }
>>
>> if (pthread_mutex_unlock (m) != 0)
>> @@ -155,18 +184,22 @@ check_type (const char *mas, pthread_mutexattr_t *ma)
>> }
>>
>> /* Elided mutexes don't fail destroy. */
>> - e = pthread_mutex_destroy (m);
>> - if (e == 0)
>> + if (assume_elided_mutex == false)
>> {
>> - printf ("mutex_destroy of self-trylocked mutex succeeded for %s\n", mas);
>> - return 1;
>> - }
>> - if (e != EBUSY)
>> - {
>> - printf ("\
>> + e = pthread_mutex_destroy (m);
>> + if (e == 0)
>> + {
>> + printf ("mutex_destroy of self-trylocked mutex succeeded for %s\n",
>> + mas);
>> + return 1;
>> + }
>> + if (e != EBUSY)
>> + {
>> + printf ("\
>> mutex_destroy of self-trylocked mutex did not return EBUSY %s\n",
>> - mas);
>> - return 1;
>> + mas);
>> + return 1;
>> + }
>
> OK.
>
>> }
>>
>> if (pthread_mutex_unlock (m) != 0)
>> @@ -203,17 +236,21 @@ mutex_destroy of self-trylocked mutex did not return EBUSY %s\n",
>> }
>>
>> /* Elided mutexes don't fail destroy. */
>> - e = pthread_mutex_destroy (m);
>> - if (e == 0)
>> - {
>> - printf ("mutex_destroy of condvar-used mutex succeeded for %s\n", mas);
>> - return 1;
>> - }
>> - if (e != EBUSY)
>> + if (assume_elided_mutex == false)
>> {
>> - printf ("\
>> + e = pthread_mutex_destroy (m);
>> + if (e == 0)
>> + {
>> + printf ("mutex_destroy of condvar-used mutex succeeded for %s\n",
>> + mas);
>> + return 1;
>> + }
>> + if (e != EBUSY)
>> + {
>> + printf ("\
>> mutex_destroy of condvar-used mutex did not return EBUSY for %s\n", mas);
>> - return 1;
>> + return 1;
>> + }
>
> OK.
>
>> }
>>
>> done = true;
>> @@ -274,19 +311,22 @@ mutex_destroy of condvar-used mutex did not return EBUSY for %s\n", mas);
>> }
>>
>> /* Elided mutexes don't fail destroy. */
>> - e = pthread_mutex_destroy (m);
>> - if (e == 0)
>> - {
>> - printf ("2nd mutex_destroy of condvar-used mutex succeeded for %s\n",
>> - mas);
>> - return 1;
>> - }
>> - if (e != EBUSY)
>> + if (assume_elided_mutex == false)
>> {
>> - printf ("\
>> + e = pthread_mutex_destroy (m);
>> + if (e == 0)
>> + {
>> + printf ("2nd mutex_destroy of condvar-used mutex succeeded for %s\n",
>> + mas);
>> + return 1;
>> + }
>> + if (e != EBUSY)
>> + {
>> + printf ("\
>> 2nd mutex_destroy of condvar-used mutex did not return EBUSY for %s\n",
>> - mas);
>> - return 1;
>> + mas);
>> + return 1;
>> + }
>
> OK.
>
>> }
>>
>> if (pthread_cancel (th) != 0)
>
>
More information about the Libc-alpha
mailing list