2 #define __EXPORTED_HEADERS__
4 #include <linux/membarrier.h>
5 #include <asm-generic/unistd.h>
6 #include <sys/syscall.h>
11 #include "../kselftest.h"
13 enum test_membarrier_status {
14 TEST_MEMBARRIER_PASS = 0,
19 static int sys_membarrier(int cmd, int flags)
21 return syscall(__NR_membarrier, cmd, flags);
24 static enum test_membarrier_status test_membarrier_cmd_fail(void)
26 int cmd = -1, flags = 0;
28 if (sys_membarrier(cmd, flags) != -1) {
29 printf("membarrier: Wrong command should fail but passed.\n");
30 return TEST_MEMBARRIER_FAIL;
32 return TEST_MEMBARRIER_PASS;
35 static enum test_membarrier_status test_membarrier_flags_fail(void)
37 int cmd = MEMBARRIER_CMD_QUERY, flags = 1;
39 if (sys_membarrier(cmd, flags) != -1) {
40 printf("membarrier: Wrong flags should fail but passed.\n");
41 return TEST_MEMBARRIER_FAIL;
43 return TEST_MEMBARRIER_PASS;
46 static enum test_membarrier_status test_membarrier_success(void)
48 int cmd = MEMBARRIER_CMD_SHARED, flags = 0;
50 if (sys_membarrier(cmd, flags) != 0) {
51 printf("membarrier: Executing MEMBARRIER_CMD_SHARED failed. %s.\n",
53 return TEST_MEMBARRIER_FAIL;
56 printf("membarrier: MEMBARRIER_CMD_SHARED success.\n");
57 return TEST_MEMBARRIER_PASS;
60 static enum test_membarrier_status test_membarrier(void)
62 enum test_membarrier_status status;
64 status = test_membarrier_cmd_fail();
67 status = test_membarrier_flags_fail();
70 status = test_membarrier_success();
73 return TEST_MEMBARRIER_PASS;
76 static enum test_membarrier_status test_membarrier_query(void)
80 printf("membarrier MEMBARRIER_CMD_QUERY ");
81 ret = sys_membarrier(MEMBARRIER_CMD_QUERY, flags);
83 printf("failed. %s.\n", strerror(errno));
87 * It is valid to build a kernel with
88 * CONFIG_MEMBARRIER=n. However, this skips the tests.
90 return TEST_MEMBARRIER_SKIP;
93 return TEST_MEMBARRIER_FAIL;
96 if (!(ret & MEMBARRIER_CMD_SHARED)) {
97 printf("command MEMBARRIER_CMD_SHARED is not supported.\n");
98 return TEST_MEMBARRIER_FAIL;
100 printf("syscall available.\n");
101 return TEST_MEMBARRIER_PASS;
104 int main(int argc, char **argv)
106 switch (test_membarrier_query()) {
107 case TEST_MEMBARRIER_FAIL:
108 return ksft_exit_fail();
109 case TEST_MEMBARRIER_SKIP:
110 return ksft_exit_skip();
112 switch (test_membarrier()) {
113 case TEST_MEMBARRIER_FAIL:
114 return ksft_exit_fail();
115 case TEST_MEMBARRIER_SKIP:
116 return ksft_exit_skip();
119 printf("membarrier: tests done!\n");
120 return ksft_exit_pass();