Commit fbf4dec7 authored by Nysal Jan K.A's avatar Nysal Jan K.A Committed by Shuah Khan

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: f4addd54 ("selftests: futex: Expand timeout test")
Signed-off-by: default avatarNysal Jan K.A <nysal@linux.ibm.com>
Signed-off-by: default avatarShuah Khan <skhan@linuxfoundation.org>
parent 888c72d5
...@@ -24,6 +24,7 @@ ...@@ -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) ...@@ -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[]) ...@@ -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[]) ...@@ -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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment