1 // SPDX-License-Identifier: GPL-2.0
3 #include <linux/membarrier.h>
9 #include "../kselftest.h"
11 static int sys_membarrier(int cmd, int flags)
13 return syscall(__NR_membarrier, cmd, flags);
16 static int test_membarrier_cmd_fail(void)
18 int cmd = -1, flags = 0;
20 if (sys_membarrier(cmd, flags) != -1) {
22 "sys membarrier invalid command test: command = %d, flags = %d. Should fail, but passed\n",
26 ksft_test_result_pass(
27 "sys membarrier invalid command test: command = %d, flags = %d. Failed as expected\n",
32 static int test_membarrier_flags_fail(void)
34 int cmd = MEMBARRIER_CMD_QUERY, flags = 1;
36 if (sys_membarrier(cmd, flags) != -1) {
38 "sys membarrier MEMBARRIER_CMD_QUERY invalid flags test: flags = %d. Should fail, but passed\n",
42 ksft_test_result_pass(
43 "sys membarrier MEMBARRIER_CMD_QUERY invalid flags test: flags = %d. Failed as expected\n",
48 static int test_membarrier_success(void)
50 int cmd = MEMBARRIER_CMD_SHARED, flags = 0;
51 const char *test_name = "sys membarrier MEMBARRIER_CMD_SHARED\n";
53 if (sys_membarrier(cmd, flags) != 0) {
55 "sys membarrier MEMBARRIER_CMD_SHARED test: flags = %d\n",
59 ksft_test_result_pass(
60 "sys membarrier MEMBARRIER_CMD_SHARED test: flags = %d\n",
65 static int test_membarrier(void)
69 status = test_membarrier_cmd_fail();
72 status = test_membarrier_flags_fail();
75 status = test_membarrier_success();
81 static int test_membarrier_query(void)
85 ret = sys_membarrier(MEMBARRIER_CMD_QUERY, flags);
87 if (errno == ENOSYS) {
89 * It is valid to build a kernel with
90 * CONFIG_MEMBARRIER=n. However, this skips the tests.
93 "sys membarrier (CONFIG_MEMBARRIER) is disabled.\n");
95 ksft_exit_fail_msg("sys_membarrier() failed\n");
97 if (!(ret & MEMBARRIER_CMD_SHARED))
98 ksft_exit_fail_msg("sys_membarrier is not supported.\n");
100 ksft_test_result_pass("sys_membarrier available\n");
104 int main(int argc, char **argv)
108 test_membarrier_query();