Skip to content

Commit

Permalink
selftests: futex2: Add timeout test
Browse files Browse the repository at this point in the history
Adapt existing futex wait timeout file to test the same mechanism for
futex2. futex2 accepts only absolute 64bit timers, but supports both
monotonic and realtime clocks.

Signed-off-by: André Almeida <andrealmeid@collabora.com>
  • Loading branch information
andrealmeid authored and xanmod committed Jun 29, 2021
1 parent 96e0a14 commit 5ba67bd
Showing 1 changed file with 49 additions and 9 deletions.
58 changes: 49 additions & 9 deletions tools/testing/selftests/futex/functional/futex_wait_timeout.c
Expand Up @@ -11,6 +11,7 @@
*
* HISTORY
* 2009-Nov-6: Initial version by Darren Hart <dvhart@linux.intel.com>
* 2021-Feb-5: Add futex2 test by André <andrealmeid@collabora.com>
*
*****************************************************************************/

Expand All @@ -20,7 +21,7 @@
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "futextest.h"
#include "futex2test.h"
#include "logging.h"

#define TEST_NAME "futex-wait-timeout"
Expand All @@ -40,7 +41,8 @@ void usage(char *prog)
int main(int argc, char *argv[])
{
futex_t f1 = FUTEX_INITIALIZER;
struct timespec to;
struct timespec to = {.tv_sec = 0, .tv_nsec = timeout_ns};
struct timespec64 to64;
int res, ret = RET_PASS;
int c;

Expand All @@ -65,22 +67,60 @@ int main(int argc, char *argv[])
}

ksft_print_header();
ksft_set_plan(1);
ksft_set_plan(3);
ksft_print_msg("%s: Block on a futex and wait for timeout\n",
basename(argv[0]));
ksft_print_msg("\tArguments: timeout=%ldns\n", timeout_ns);

/* initialize timeout */
to.tv_sec = 0;
to.tv_nsec = timeout_ns;

info("Calling futex_wait on f1: %u @ %p\n", f1, &f1);
res = futex_wait(&f1, f1, &to, FUTEX_PRIVATE_FLAG);
if (!res || errno != ETIMEDOUT) {
fail("futex_wait returned %d\n", ret < 0 ? errno : ret);
ksft_test_result_fail("futex_wait returned %d\n", ret < 0 ? errno : ret);
ret = RET_FAIL;
} else {
ksft_test_result_pass("futex_wait timeout succeeds\n");
}

/* setting absolute monotonic timeout for futex2 */
if (gettime64(CLOCK_MONOTONIC, &to64))
error("gettime64 failed\n", errno);

to64.tv_nsec += timeout_ns;

if (to64.tv_nsec >= 1000000000) {
to64.tv_sec++;
to64.tv_nsec -= 1000000000;
}

info("Calling futex2_wait on f1: %u @ %p\n", f1, &f1);
res = futex2_wait(&f1, f1, FUTEX_32, &to64);
if (!res || errno != ETIMEDOUT) {
ksft_test_result_fail("futex2_wait monotonic returned %d\n", ret < 0 ? errno : ret);
ret = RET_FAIL;
} else {
ksft_test_result_pass("futex2_wait monotonic timeout succeeds\n");
}

/* setting absolute realtime timeout for futex2 */
if (gettime64(CLOCK_REALTIME, &to64))
error("gettime64 failed\n", errno);

to64.tv_nsec += timeout_ns;

if (to64.tv_nsec >= 1000000000) {
to64.tv_sec++;
to64.tv_nsec -= 1000000000;
}

info("Calling futex2_wait on f1: %u @ %p\n", f1, &f1);
res = futex2_wait(&f1, f1, FUTEX_32 | FUTEX_CLOCK_REALTIME, &to64);
if (!res || errno != ETIMEDOUT) {
ksft_test_result_fail("futex2_wait realtime returned %d\n", ret < 0 ? errno : ret);
ret = RET_FAIL;
} else {
ksft_test_result_pass("futex2_wait realtime timeout succeeds\n");
}

print_result(TEST_NAME, ret);
ksft_print_cnts();
return ret;
}

0 comments on commit 5ba67bd

Please sign in to comment.