Commit f341a20f authored by André Almeida's avatar André Almeida Committed by Thomas Gleixner
Browse files

selftests/futex: Refactor futex_requeue with kselftest_harness.h



To reduce the boilerplate code, refactor futex_requeue test to use
kselftest_harness header instead of futex's logging header.

Signed-off-by: default avatarAndré Almeida <andrealmeid@igalia.com>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent e5c04d0f
Loading
Loading
Loading
Loading
+23 −53
Original line number Diff line number Diff line
@@ -7,24 +7,15 @@

#include <pthread.h>
#include <limits.h>
#include "logging.h"

#include "futextest.h"
#include "../../kselftest_harness.h"

#define TEST_NAME "futex-requeue"
#define timeout_ns  30000000
#define WAKE_WAIT_US 10000

volatile futex_t *f1;

void usage(char *prog)
{
	printf("Usage: %s\n", prog);
	printf("  -c	Use color\n");
	printf("  -h	Display this help message\n");
	printf("  -v L	Verbosity level: %d=QUIET %d=CRITICAL %d=INFO\n",
	       VQUIET, VCRITICAL, VINFO);
}

void *waiterfn(void *arg)
{
	struct timespec to;
@@ -38,67 +29,49 @@ void *waiterfn(void *arg)
	return NULL;
}

int main(int argc, char *argv[])
TEST(requeue_single)
{
	pthread_t waiter[10];
	int res, ret = RET_PASS;
	int c, i;
	volatile futex_t _f1 = 0;
	volatile futex_t f2 = 0;
	pthread_t waiter[10];
	int res;

	f1 = &_f1;

	while ((c = getopt(argc, argv, "cht:v:")) != -1) {
		switch (c) {
		case 'c':
			log_color(1);
			break;
		case 'h':
			usage(basename(argv[0]));
			exit(0);
		case 'v':
			log_verbosity(atoi(optarg));
			break;
		default:
			usage(basename(argv[0]));
			exit(1);
		}
	}

	ksft_print_header();
	ksft_set_plan(2);
	ksft_print_msg("%s: Test futex_requeue\n",
		       basename(argv[0]));

	/*
	 * Requeue a waiter from f1 to f2, and wake f2.
	 */
	if (pthread_create(&waiter[0], NULL, waiterfn, NULL))
		error("pthread_create failed\n", errno);
		ksft_exit_fail_msg("pthread_create failed\n");

	usleep(WAKE_WAIT_US);

	info("Requeuing 1 futex from f1 to f2\n");
	ksft_print_dbg_msg("Requeuing 1 futex from f1 to f2\n");
	res = futex_cmp_requeue(f1, 0, &f2, 0, 1, 0);
	if (res != 1) {
	if (res != 1)
		ksft_test_result_fail("futex_requeue simple returned: %d %s\n",
				      res ? errno : res,
				      res ? strerror(errno) : "");
		ret = RET_FAIL;
	}


	info("Waking 1 futex at f2\n");
	ksft_print_dbg_msg("Waking 1 futex at f2\n");
	res = futex_wake(&f2, 1, 0);
	if (res != 1) {
		ksft_test_result_fail("futex_requeue simple returned: %d %s\n",
				      res ? errno : res,
				      res ? strerror(errno) : "");
		ret = RET_FAIL;
	} else {
		ksft_test_result_pass("futex_requeue simple succeeds\n");
	}
}

TEST(requeue_multiple)
{
	volatile futex_t _f1 = 0;
	volatile futex_t f2 = 0;
	pthread_t waiter[10];
	int res, i;

	f1 = &_f1;

	/*
	 * Create 10 waiters at f1. At futex_requeue, wake 3 and requeue 7.
@@ -106,31 +79,28 @@ int main(int argc, char *argv[])
	 */
	for (i = 0; i < 10; i++) {
		if (pthread_create(&waiter[i], NULL, waiterfn, NULL))
			error("pthread_create failed\n", errno);
			ksft_exit_fail_msg("pthread_create failed\n");
	}

	usleep(WAKE_WAIT_US);

	info("Waking 3 futexes at f1 and requeuing 7 futexes from f1 to f2\n");
	ksft_print_dbg_msg("Waking 3 futexes at f1 and requeuing 7 futexes from f1 to f2\n");
	res = futex_cmp_requeue(f1, 0, &f2, 3, 7, 0);
	if (res != 10) {
		ksft_test_result_fail("futex_requeue many returned: %d %s\n",
				      res ? errno : res,
				      res ? strerror(errno) : "");
		ret = RET_FAIL;
	}

	info("Waking INT_MAX futexes at f2\n");
	ksft_print_dbg_msg("Waking INT_MAX futexes at f2\n");
	res = futex_wake(&f2, INT_MAX, 0);
	if (res != 7) {
		ksft_test_result_fail("futex_requeue many returned: %d %s\n",
				      res ? errno : res,
				      res ? strerror(errno) : "");
		ret = RET_FAIL;
	} else {
		ksft_test_result_pass("futex_requeue many succeeds\n");
	}

	ksft_print_cnts();
	return ret;
}

TEST_HARNESS_MAIN
+1 −1
Original line number Diff line number Diff line
@@ -54,7 +54,7 @@ echo
./futex_wait

echo
./futex_requeue $COLOR
./futex_requeue

echo
./futex_waitv $COLOR