blob: 21399fcf1a59125a613db1c330a8b782790fd4d9 [file] [log] [blame]
Pranith Kumarb6d97342015-09-11 13:07:42 -07001#define _GNU_SOURCE
Pranith Kumarb6d97342015-09-11 13:07:42 -07002#include <linux/membarrier.h>
Mathieu Desnoyers7a07b502015-09-22 14:59:20 -07003#include <syscall.h>
Pranith Kumarb6d97342015-09-11 13:07:42 -07004#include <stdio.h>
5#include <errno.h>
6#include <string.h>
7
8#include "../kselftest.h"
9
10static int sys_membarrier(int cmd, int flags)
11{
12 return syscall(__NR_membarrier, cmd, flags);
13}
14
Shuah Khane67f85f2017-06-29 16:54:57 -060015static int test_membarrier_cmd_fail(void)
Pranith Kumarb6d97342015-09-11 13:07:42 -070016{
17 int cmd = -1, flags = 0;
18
19 if (sys_membarrier(cmd, flags) != -1) {
Shuah Khane67f85f2017-06-29 16:54:57 -060020 ksft_exit_fail_msg(
21 "sys membarrier invalid command test: command = %d, flags = %d. Should fail, but passed\n",
22 cmd, flags);
Pranith Kumarb6d97342015-09-11 13:07:42 -070023 }
Paul Elder326f57a2017-06-12 08:56:48 +020024
Shuah Khane67f85f2017-06-29 16:54:57 -060025 ksft_test_result_pass(
26 "sys membarrier invalid command test: command = %d, flags = %d. Failed as expected\n",
27 cmd, flags);
28 return 0;
Pranith Kumarb6d97342015-09-11 13:07:42 -070029}
30
Shuah Khane67f85f2017-06-29 16:54:57 -060031static int test_membarrier_flags_fail(void)
Pranith Kumarb6d97342015-09-11 13:07:42 -070032{
Mathieu Desnoyersc9946c42015-09-11 13:07:45 -070033 int cmd = MEMBARRIER_CMD_QUERY, flags = 1;
Pranith Kumarb6d97342015-09-11 13:07:42 -070034
Mathieu Desnoyersc9946c42015-09-11 13:07:45 -070035 if (sys_membarrier(cmd, flags) != -1) {
Shuah Khane67f85f2017-06-29 16:54:57 -060036 ksft_exit_fail_msg(
37 "sys membarrier MEMBARRIER_CMD_QUERY invalid flags test: flags = %d. Should fail, but passed\n",
38 flags);
Mathieu Desnoyersc9946c42015-09-11 13:07:45 -070039 }
Paul Elder326f57a2017-06-12 08:56:48 +020040
Shuah Khane67f85f2017-06-29 16:54:57 -060041 ksft_test_result_pass(
42 "sys membarrier MEMBARRIER_CMD_QUERY invalid flags test: flags = %d. Failed as expected\n",
43 flags);
44 return 0;
Mathieu Desnoyersc9946c42015-09-11 13:07:45 -070045}
46
Shuah Khane67f85f2017-06-29 16:54:57 -060047static int test_membarrier_success(void)
Mathieu Desnoyersc9946c42015-09-11 13:07:45 -070048{
49 int cmd = MEMBARRIER_CMD_SHARED, flags = 0;
Shuah Khane67f85f2017-06-29 16:54:57 -060050 const char *test_name = "sys membarrier MEMBARRIER_CMD_SHARED\n";
Mathieu Desnoyersc9946c42015-09-11 13:07:45 -070051
52 if (sys_membarrier(cmd, flags) != 0) {
Shuah Khane67f85f2017-06-29 16:54:57 -060053 ksft_exit_fail_msg(
54 "sys membarrier MEMBARRIER_CMD_SHARED test: flags = %d\n",
55 flags);
Pranith Kumarb6d97342015-09-11 13:07:42 -070056 }
57
Shuah Khane67f85f2017-06-29 16:54:57 -060058 ksft_test_result_pass(
59 "sys membarrier MEMBARRIER_CMD_SHARED test: flags = %d\n",
60 flags);
61 return 0;
Pranith Kumarb6d97342015-09-11 13:07:42 -070062}
63
Shuah Khane67f85f2017-06-29 16:54:57 -060064static int test_membarrier(void)
Pranith Kumarb6d97342015-09-11 13:07:42 -070065{
Shuah Khane67f85f2017-06-29 16:54:57 -060066 int status;
Mathieu Desnoyersc9946c42015-09-11 13:07:45 -070067
68 status = test_membarrier_cmd_fail();
69 if (status)
70 return status;
71 status = test_membarrier_flags_fail();
72 if (status)
73 return status;
74 status = test_membarrier_success();
75 if (status)
76 return status;
Shuah Khane67f85f2017-06-29 16:54:57 -060077 return 0;
Pranith Kumarb6d97342015-09-11 13:07:42 -070078}
79
Shuah Khane67f85f2017-06-29 16:54:57 -060080static int test_membarrier_query(void)
Pranith Kumarb6d97342015-09-11 13:07:42 -070081{
Mathieu Desnoyersc9946c42015-09-11 13:07:45 -070082 int flags = 0, ret;
Pranith Kumarb6d97342015-09-11 13:07:42 -070083
Mathieu Desnoyersc9946c42015-09-11 13:07:45 -070084 ret = sys_membarrier(MEMBARRIER_CMD_QUERY, flags);
85 if (ret < 0) {
Paul Elder326f57a2017-06-12 08:56:48 +020086 if (errno == ENOSYS) {
Mathieu Desnoyersc9946c42015-09-11 13:07:45 -070087 /*
88 * It is valid to build a kernel with
89 * CONFIG_MEMBARRIER=n. However, this skips the tests.
90 */
Shuah Khane67f85f2017-06-29 16:54:57 -060091 ksft_exit_skip(
92 "sys membarrier (CONFIG_MEMBARRIER) is disabled.\n");
Mathieu Desnoyersc9946c42015-09-11 13:07:45 -070093 }
Shuah Khane67f85f2017-06-29 16:54:57 -060094 ksft_exit_fail_msg("sys_membarrier() failed\n");
Mathieu Desnoyersc9946c42015-09-11 13:07:45 -070095 }
Shuah Khane67f85f2017-06-29 16:54:57 -060096 if (!(ret & MEMBARRIER_CMD_SHARED))
97 ksft_exit_fail_msg("sys_membarrier is not supported.\n");
98
99 ksft_test_result_pass("sys_membarrier available\n");
100 return 0;
Pranith Kumarb6d97342015-09-11 13:07:42 -0700101}
102
103int main(int argc, char **argv)
104{
Paul Elder326f57a2017-06-12 08:56:48 +0200105 ksft_print_header();
Pranith Kumarb6d97342015-09-11 13:07:42 -0700106
Shuah Khane67f85f2017-06-29 16:54:57 -0600107 test_membarrier_query();
108 test_membarrier();
109
110 ksft_exit_pass();
Pranith Kumarb6d97342015-09-11 13:07:42 -0700111}