1 /* SPDX-License-Identifier: GPL-2.0 */
3 #include <linux/membarrier.h>
10 #include "../kselftest.h"
12 static int registrations
;
14 static int sys_membarrier(int cmd
, int flags
)
16 return syscall(__NR_membarrier
, cmd
, flags
);
19 static int test_membarrier_get_registrations(int cmd
)
22 const char *test_name
=
23 "sys membarrier MEMBARRIER_CMD_GET_REGISTRATIONS";
27 ret
= sys_membarrier(MEMBARRIER_CMD_GET_REGISTRATIONS
, 0);
30 "%s test: flags = %d, errno = %d\n",
31 test_name
, flags
, errno
);
32 } else if (ret
!= registrations
) {
34 "%s test: flags = %d, ret = %d, registrations = %d\n",
35 test_name
, flags
, ret
, registrations
);
37 ksft_test_result_pass(
38 "%s test: flags = %d, ret = %d, registrations = %d\n",
39 test_name
, flags
, ret
, registrations
);
44 static int test_membarrier_cmd_fail(void)
46 int cmd
= -1, flags
= 0;
47 const char *test_name
= "sys membarrier invalid command";
49 if (sys_membarrier(cmd
, flags
) != -1) {
51 "%s test: command = %d, flags = %d. Should fail, but passed\n",
52 test_name
, cmd
, flags
);
54 if (errno
!= EINVAL
) {
56 "%s test: flags = %d. Should return (%d: \"%s\"), but returned (%d: \"%s\").\n",
57 test_name
, flags
, EINVAL
, strerror(EINVAL
),
58 errno
, strerror(errno
));
61 ksft_test_result_pass(
62 "%s test: command = %d, flags = %d, errno = %d. Failed as expected\n",
63 test_name
, cmd
, flags
, errno
);
67 static int test_membarrier_flags_fail(void)
69 int cmd
= MEMBARRIER_CMD_QUERY
, flags
= 1;
70 const char *test_name
= "sys membarrier MEMBARRIER_CMD_QUERY invalid flags";
72 if (sys_membarrier(cmd
, flags
) != -1) {
74 "%s test: flags = %d. Should fail, but passed\n",
77 if (errno
!= EINVAL
) {
79 "%s test: flags = %d. Should return (%d: \"%s\"), but returned (%d: \"%s\").\n",
80 test_name
, flags
, EINVAL
, strerror(EINVAL
),
81 errno
, strerror(errno
));
84 ksft_test_result_pass(
85 "%s test: flags = %d, errno = %d. Failed as expected\n",
86 test_name
, flags
, errno
);
90 static int test_membarrier_global_success(void)
92 int cmd
= MEMBARRIER_CMD_GLOBAL
, flags
= 0;
93 const char *test_name
= "sys membarrier MEMBARRIER_CMD_GLOBAL";
95 if (sys_membarrier(cmd
, flags
) != 0) {
97 "%s test: flags = %d, errno = %d\n",
98 test_name
, flags
, errno
);
101 ksft_test_result_pass(
102 "%s test: flags = %d\n", test_name
, flags
);
106 static int test_membarrier_private_expedited_fail(void)
108 int cmd
= MEMBARRIER_CMD_PRIVATE_EXPEDITED
, flags
= 0;
109 const char *test_name
= "sys membarrier MEMBARRIER_CMD_PRIVATE_EXPEDITED not registered failure";
111 if (sys_membarrier(cmd
, flags
) != -1) {
113 "%s test: flags = %d. Should fail, but passed\n",
116 if (errno
!= EPERM
) {
118 "%s test: flags = %d. Should return (%d: \"%s\"), but returned (%d: \"%s\").\n",
119 test_name
, flags
, EPERM
, strerror(EPERM
),
120 errno
, strerror(errno
));
123 ksft_test_result_pass(
124 "%s test: flags = %d, errno = %d\n",
125 test_name
, flags
, errno
);
129 static int test_membarrier_register_private_expedited_success(void)
131 int cmd
= MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED
, flags
= 0;
132 const char *test_name
= "sys membarrier MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED";
134 if (sys_membarrier(cmd
, flags
) != 0) {
136 "%s test: flags = %d, errno = %d\n",
137 test_name
, flags
, errno
);
140 ksft_test_result_pass(
141 "%s test: flags = %d\n",
144 test_membarrier_get_registrations(cmd
);
148 static int test_membarrier_private_expedited_success(void)
150 int cmd
= MEMBARRIER_CMD_PRIVATE_EXPEDITED
, flags
= 0;
151 const char *test_name
= "sys membarrier MEMBARRIER_CMD_PRIVATE_EXPEDITED";
153 if (sys_membarrier(cmd
, flags
) != 0) {
155 "%s test: flags = %d, errno = %d\n",
156 test_name
, flags
, errno
);
159 ksft_test_result_pass(
160 "%s test: flags = %d\n",
165 static int test_membarrier_private_expedited_sync_core_fail(void)
167 int cmd
= MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE
, flags
= 0;
168 const char *test_name
= "sys membarrier MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE not registered failure";
170 if (sys_membarrier(cmd
, flags
) != -1) {
172 "%s test: flags = %d. Should fail, but passed\n",
175 if (errno
!= EPERM
) {
177 "%s test: flags = %d. Should return (%d: \"%s\"), but returned (%d: \"%s\").\n",
178 test_name
, flags
, EPERM
, strerror(EPERM
),
179 errno
, strerror(errno
));
182 ksft_test_result_pass(
183 "%s test: flags = %d, errno = %d\n",
184 test_name
, flags
, errno
);
188 static int test_membarrier_register_private_expedited_sync_core_success(void)
190 int cmd
= MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE
, flags
= 0;
191 const char *test_name
= "sys membarrier MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE";
193 if (sys_membarrier(cmd
, flags
) != 0) {
195 "%s test: flags = %d, errno = %d\n",
196 test_name
, flags
, errno
);
199 ksft_test_result_pass(
200 "%s test: flags = %d\n",
203 test_membarrier_get_registrations(cmd
);
207 static int test_membarrier_private_expedited_sync_core_success(void)
209 int cmd
= MEMBARRIER_CMD_PRIVATE_EXPEDITED
, flags
= 0;
210 const char *test_name
= "sys membarrier MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE";
212 if (sys_membarrier(cmd
, flags
) != 0) {
214 "%s test: flags = %d, errno = %d\n",
215 test_name
, flags
, errno
);
218 ksft_test_result_pass(
219 "%s test: flags = %d\n",
224 static int test_membarrier_register_global_expedited_success(void)
226 int cmd
= MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED
, flags
= 0;
227 const char *test_name
= "sys membarrier MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED";
229 if (sys_membarrier(cmd
, flags
) != 0) {
231 "%s test: flags = %d, errno = %d\n",
232 test_name
, flags
, errno
);
235 ksft_test_result_pass(
236 "%s test: flags = %d\n",
239 test_membarrier_get_registrations(cmd
);
243 static int test_membarrier_global_expedited_success(void)
245 int cmd
= MEMBARRIER_CMD_GLOBAL_EXPEDITED
, flags
= 0;
246 const char *test_name
= "sys membarrier MEMBARRIER_CMD_GLOBAL_EXPEDITED";
248 if (sys_membarrier(cmd
, flags
) != 0) {
250 "%s test: flags = %d, errno = %d\n",
251 test_name
, flags
, errno
);
254 ksft_test_result_pass(
255 "%s test: flags = %d\n",
260 static int test_membarrier_fail(void)
264 status
= test_membarrier_cmd_fail();
267 status
= test_membarrier_flags_fail();
270 status
= test_membarrier_private_expedited_fail();
273 status
= sys_membarrier(MEMBARRIER_CMD_QUERY
, 0);
275 ksft_test_result_fail("sys_membarrier() failed\n");
278 if (status
& MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE
) {
279 status
= test_membarrier_private_expedited_sync_core_fail();
286 static int test_membarrier_success(void)
290 status
= test_membarrier_global_success();
293 status
= test_membarrier_register_private_expedited_success();
296 status
= test_membarrier_private_expedited_success();
299 status
= sys_membarrier(MEMBARRIER_CMD_QUERY
, 0);
301 ksft_test_result_fail("sys_membarrier() failed\n");
304 if (status
& MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE
) {
305 status
= test_membarrier_register_private_expedited_sync_core_success();
308 status
= test_membarrier_private_expedited_sync_core_success();
313 * It is valid to send a global membarrier from a non-registered
316 status
= test_membarrier_global_expedited_success();
319 status
= test_membarrier_register_global_expedited_success();
322 status
= test_membarrier_global_expedited_success();
328 static int test_membarrier_query(void)
332 ret
= sys_membarrier(MEMBARRIER_CMD_QUERY
, flags
);
334 if (errno
== ENOSYS
) {
336 * It is valid to build a kernel with
337 * CONFIG_MEMBARRIER=n. However, this skips the tests.
340 "sys membarrier (CONFIG_MEMBARRIER) is disabled.\n");
342 ksft_exit_fail_msg("sys_membarrier() failed\n");
344 if (!(ret
& MEMBARRIER_CMD_GLOBAL
))
346 "sys_membarrier unsupported: CMD_GLOBAL not found.\n");
348 ksft_test_result_pass("sys_membarrier available\n");