|
@@ -32,76 +32,82 @@
|
|
#include <sys/stat.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/wait.h>
|
|
#include <sys/wait.h>
|
|
#include <errno.h>
|
|
#include <errno.h>
|
|
|
|
+#include <string.h>
|
|
|
|
|
|
|
|
+#include "../kselftest.h"
|
|
#include "synctest.h"
|
|
#include "synctest.h"
|
|
|
|
|
|
static int run_test(int (*test)(void), char *name)
|
|
static int run_test(int (*test)(void), char *name)
|
|
{
|
|
{
|
|
int result;
|
|
int result;
|
|
pid_t childpid;
|
|
pid_t childpid;
|
|
|
|
+ int ret;
|
|
|
|
|
|
fflush(stdout);
|
|
fflush(stdout);
|
|
childpid = fork();
|
|
childpid = fork();
|
|
|
|
|
|
if (childpid) {
|
|
if (childpid) {
|
|
waitpid(childpid, &result, 0);
|
|
waitpid(childpid, &result, 0);
|
|
- if (WIFEXITED(result))
|
|
|
|
- return WEXITSTATUS(result);
|
|
|
|
|
|
+ if (WIFEXITED(result)) {
|
|
|
|
+ ret = WEXITSTATUS(result);
|
|
|
|
+ if (!ret)
|
|
|
|
+ ksft_test_result_pass("[RUN]\t%s\n", name);
|
|
|
|
+ else
|
|
|
|
+ ksft_test_result_fail("[RUN]\t%s\n", name);
|
|
|
|
+ return ret;
|
|
|
|
+ }
|
|
return 1;
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
|
|
- printf("[RUN]\tExecuting %s\n", name);
|
|
|
|
exit(test());
|
|
exit(test());
|
|
}
|
|
}
|
|
|
|
|
|
-static int sync_api_supported(void)
|
|
|
|
|
|
+static void sync_api_supported(void)
|
|
{
|
|
{
|
|
struct stat sbuf;
|
|
struct stat sbuf;
|
|
int ret;
|
|
int ret;
|
|
|
|
|
|
ret = stat("/sys/kernel/debug/sync/sw_sync", &sbuf);
|
|
ret = stat("/sys/kernel/debug/sync/sw_sync", &sbuf);
|
|
if (!ret)
|
|
if (!ret)
|
|
- return 0;
|
|
|
|
|
|
+ return;
|
|
|
|
|
|
- if (errno == ENOENT) {
|
|
|
|
- printf("SKIP: Sync framework not supported by kernel\n");
|
|
|
|
- exit(0);
|
|
|
|
- }
|
|
|
|
- if (errno == EACCES) {
|
|
|
|
- printf("SKIP: Run Sync test as root.\n");
|
|
|
|
- exit(0);
|
|
|
|
- }
|
|
|
|
|
|
+ if (errno == ENOENT)
|
|
|
|
+ ksft_exit_skip("Sync framework not supported by kernel\n");
|
|
|
|
|
|
- perror("stat");
|
|
|
|
- exit(ret);
|
|
|
|
|
|
+ if (errno == EACCES)
|
|
|
|
+ ksft_exit_skip("Run Sync test as root.\n");
|
|
|
|
|
|
|
|
+ ksft_exit_fail_msg("stat failed on /sys/kernel/debug/sync/sw_sync: %s",
|
|
|
|
+ strerror(errno));
|
|
}
|
|
}
|
|
|
|
|
|
int main(void)
|
|
int main(void)
|
|
{
|
|
{
|
|
- int err = 0;
|
|
|
|
|
|
+ int err;
|
|
|
|
+
|
|
|
|
+ ksft_print_header();
|
|
|
|
|
|
- if (!sync_api_supported())
|
|
|
|
- return 0;
|
|
|
|
|
|
+ sync_api_supported();
|
|
|
|
|
|
- printf("[RUN]\tTesting sync framework\n");
|
|
|
|
|
|
+ ksft_print_msg("[RUN]\tTesting sync framework\n");
|
|
|
|
|
|
- err += RUN_TEST(test_alloc_timeline);
|
|
|
|
- err += RUN_TEST(test_alloc_fence);
|
|
|
|
- err += RUN_TEST(test_alloc_fence_negative);
|
|
|
|
|
|
+ RUN_TEST(test_alloc_timeline);
|
|
|
|
+ RUN_TEST(test_alloc_fence);
|
|
|
|
+ RUN_TEST(test_alloc_fence_negative);
|
|
|
|
|
|
- err += RUN_TEST(test_fence_one_timeline_wait);
|
|
|
|
- err += RUN_TEST(test_fence_one_timeline_merge);
|
|
|
|
- err += RUN_TEST(test_fence_merge_same_fence);
|
|
|
|
- err += RUN_TEST(test_fence_multi_timeline_wait);
|
|
|
|
- err += RUN_TEST(test_stress_two_threads_shared_timeline);
|
|
|
|
- err += RUN_TEST(test_consumer_stress_multi_producer_single_consumer);
|
|
|
|
- err += RUN_TEST(test_merge_stress_random_merge);
|
|
|
|
|
|
+ RUN_TEST(test_fence_one_timeline_wait);
|
|
|
|
+ RUN_TEST(test_fence_one_timeline_merge);
|
|
|
|
+ RUN_TEST(test_fence_merge_same_fence);
|
|
|
|
+ RUN_TEST(test_fence_multi_timeline_wait);
|
|
|
|
+ RUN_TEST(test_stress_two_threads_shared_timeline);
|
|
|
|
+ RUN_TEST(test_consumer_stress_multi_producer_single_consumer);
|
|
|
|
+ RUN_TEST(test_merge_stress_random_merge);
|
|
|
|
|
|
|
|
+ err = ksft_get_fail_cnt();
|
|
if (err)
|
|
if (err)
|
|
- printf("[FAIL]\tsync errors: %d\n", err);
|
|
|
|
- else
|
|
|
|
- printf("[OK]\tsync\n");
|
|
|
|
|
|
+ ksft_exit_fail_msg("%d out of %d sync tests failed\n",
|
|
|
|
+ err, ksft_test_num());
|
|
|
|
|
|
- return !!err;
|
|
|
|
|
|
+ /* need this return to keep gcc happy */
|
|
|
|
+ return ksft_exit_pass();
|
|
}
|
|
}
|