mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-10 15:58:47 +00:00
selftests/futex: Order calls to futex_lock_pi
Observed occassional failures in the futex_wait_timeout test: ok 1 futex_wait relative succeeds ok 2 futex_wait_bitset realtime succeeds ok 3 futex_wait_bitset monotonic succeeds ok 4 futex_wait_requeue_pi realtime succeeds ok 5 futex_wait_requeue_pi monotonic succeeds not ok 6 futex_lock_pi realtime returned 0 ...... The test expects the child thread to complete some steps before the parent thread gets to run. There is an implicit expectation of the order of invocation of futex_lock_pi between the child thread and the parent thread. Make this order explicit. If the order is not met, the futex_lock_pi call in the parent thread succeeds and will not timeout. Fixes: f4addd54b161 ("selftests: futex: Expand timeout test") Signed-off-by: Nysal Jan K.A <nysal@linux.ibm.com> Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
This commit is contained in:
parent
888c72d581
commit
fbf4dec702
@ -24,6 +24,7 @@
|
|||||||
|
|
||||||
static long timeout_ns = 100000; /* 100us default timeout */
|
static long timeout_ns = 100000; /* 100us default timeout */
|
||||||
static futex_t futex_pi;
|
static futex_t futex_pi;
|
||||||
|
static pthread_barrier_t barrier;
|
||||||
|
|
||||||
void usage(char *prog)
|
void usage(char *prog)
|
||||||
{
|
{
|
||||||
@ -48,6 +49,8 @@ void *get_pi_lock(void *arg)
|
|||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
error("futex_lock_pi failed\n", ret);
|
error("futex_lock_pi failed\n", ret);
|
||||||
|
|
||||||
|
pthread_barrier_wait(&barrier);
|
||||||
|
|
||||||
/* Blocks forever */
|
/* Blocks forever */
|
||||||
ret = futex_wait(&lock, 0, NULL, 0);
|
ret = futex_wait(&lock, 0, NULL, 0);
|
||||||
error("futex_wait failed\n", ret);
|
error("futex_wait failed\n", ret);
|
||||||
@ -130,6 +133,7 @@ int main(int argc, char *argv[])
|
|||||||
basename(argv[0]));
|
basename(argv[0]));
|
||||||
ksft_print_msg("\tArguments: timeout=%ldns\n", timeout_ns);
|
ksft_print_msg("\tArguments: timeout=%ldns\n", timeout_ns);
|
||||||
|
|
||||||
|
pthread_barrier_init(&barrier, NULL, 2);
|
||||||
pthread_create(&thread, NULL, get_pi_lock, NULL);
|
pthread_create(&thread, NULL, get_pi_lock, NULL);
|
||||||
|
|
||||||
/* initialize relative timeout */
|
/* initialize relative timeout */
|
||||||
@ -163,6 +167,9 @@ int main(int argc, char *argv[])
|
|||||||
res = futex_wait_requeue_pi(&f1, f1, &futex_pi, &to, 0);
|
res = futex_wait_requeue_pi(&f1, f1, &futex_pi, &to, 0);
|
||||||
test_timeout(res, &ret, "futex_wait_requeue_pi monotonic", ETIMEDOUT);
|
test_timeout(res, &ret, "futex_wait_requeue_pi monotonic", ETIMEDOUT);
|
||||||
|
|
||||||
|
/* Wait until the other thread calls futex_lock_pi() */
|
||||||
|
pthread_barrier_wait(&barrier);
|
||||||
|
pthread_barrier_destroy(&barrier);
|
||||||
/*
|
/*
|
||||||
* FUTEX_LOCK_PI with CLOCK_REALTIME
|
* FUTEX_LOCK_PI with CLOCK_REALTIME
|
||||||
* Due to historical reasons, FUTEX_LOCK_PI supports only realtime
|
* Due to historical reasons, FUTEX_LOCK_PI supports only realtime
|
||||||
|
Loading…
x
Reference in New Issue
Block a user