#include "tap.h"
-#define NR_TESTS 2
+#define NR_TESTS 4
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
{
plan_tests(NR_TESTS);
+ if (!rseq_available()) {
+ skip(NR_TESTS, "The rseq syscall is unavailable");
+ goto end;
+ }
+
if (rseq_register_current_thread()) {
- fprintf(stderr, "Error: rseq_register_current_thread(...) failed(%d): %s\n",
+ fail("rseq_register_current_thread(...) failed(%d): %s\n",
errno, strerror(errno));
- goto error;
+ goto end;
+ } else {
+ pass("Registered current thread with rseq");
}
test_percpu_spinlock();
test_percpu_list();
if (rseq_unregister_current_thread()) {
- fprintf(stderr, "Error: rseq_unregister_current_thread(...) failed(%d): %s\n",
+ fail("rseq_unregister_current_thread(...) failed(%d): %s\n",
errno, strerror(errno));
- goto error;
+ goto end;
+ } else {
+ pass("Unregistered current thread with rseq");
}
- exit(EXIT_SUCCESS);
-
-error:
- exit(EXIT_FAILURE);
+end:
+ exit(exit_status());
}
cpu_set_t affinity, test_affinity;
int ret, i;
- diag("testing current cpu");
-
ret = sched_getaffinity(0, sizeof(affinity), &affinity);
ok(ret == 0, "Get current thread affinity mask");
int main(void)
{
-
- plan_no_plan();
+ /*
+ * Skip all tests if the rseq syscall is unavailable
+ */
+ if (rseq_available()) {
+ plan_no_plan();
+ } else {
+ plan_skip_all("The rseq syscall is unavailable");
+ }
if (rseq_register_current_thread()) {
- fprintf(stderr, "Error: rseq_register_current_thread(...) failed(%d): %s\n",
+ fail("rseq_register_current_thread(...) failed(%d): %s\n",
errno, strerror(errno));
- goto init_thread_error;
+ goto end;
+ } else {
+ pass("Registered current thread with rseq");
}
test_cpu_pointer();
if (rseq_unregister_current_thread()) {
- fprintf(stderr, "Error: rseq_unregister_current_thread(...) failed(%d): %s\n",
+ fail("rseq_unregister_current_thread(...) failed(%d): %s\n",
errno, strerror(errno));
- goto init_thread_error;
+ goto end;
+ } else {
+ pass("Unregistered current thread with rseq");
}
- exit(EXIT_SUCCESS);
-
-init_thread_error:
- exit(EXIT_FAILURE);;
+end:
+ exit(exit_status());
}
printf(" [-D M] Disable rseq for each M threads\n");
printf(" [-T test] Choose test: (s)pinlock, (l)ist, (b)uffer, (m)emcpy, (i)ncrement\n");
printf(" [-M] Push into buffer and memcpy buffer with memory barriers.\n");
+ printf(" [-c] Check if the rseq syscall is available.\n");
printf(" [-v] Verbose output.\n");
printf(" [-h] Show this help.\n");
printf("\n");
case 'M':
opt_mb = 1;
break;
+ case 'c':
+ if (rseq_available()) {
+ printf_verbose("The rseq syscall is available.\n");
+ goto end;
+ } else {
+ printf_verbose("The rseq syscall is unavailable.\n");
+ goto no_rseq;
+ }
default:
show_usage(argv);
goto error;
error:
return -1;
+
+no_rseq:
+ return 2;
}
}
-plan_tests $(( 2 * 7 * 37 ))
+"$RSEQ_TESTS_BUILDDIR"/param_test -c
+if [[ $? == 2 ]]; then
+ plan_skip_all "The rseq syscall is unavailable"
+else
+ plan_tests $(( 2 * 7 * 37 ))
+fi
diag "Default parameters"
do_tests