License cleanup: add SPDX GPL-2.0 license identifier to files with no license
[linux-2.6-block.git] / tools / testing / selftests / membarrier / membarrier_test.c
CommitLineData
b2441318 1// SPDX-License-Identifier: GPL-2.0
b6d97344 2#define _GNU_SOURCE
b6d97344 3#include <linux/membarrier.h>
7a07b503 4#include <syscall.h>
b6d97344
PK
5#include <stdio.h>
6#include <errno.h>
7#include <string.h>
8
9#include "../kselftest.h"
10
11static int sys_membarrier(int cmd, int flags)
12{
13 return syscall(__NR_membarrier, cmd, flags);
14}
15
e67f85fb 16static int test_membarrier_cmd_fail(void)
b6d97344
PK
17{
18 int cmd = -1, flags = 0;
19
20 if (sys_membarrier(cmd, flags) != -1) {
e67f85fb
SK
21 ksft_exit_fail_msg(
22 "sys membarrier invalid command test: command = %d, flags = %d. Should fail, but passed\n",
23 cmd, flags);
c9946c42 24 }
326f57a4 25
e67f85fb
SK
26 ksft_test_result_pass(
27 "sys membarrier invalid command test: command = %d, flags = %d. Failed as expected\n",
28 cmd, flags);
29 return 0;
c9946c42
MD
30}
31
e67f85fb 32static int test_membarrier_flags_fail(void)
c9946c42
MD
33{
34 int cmd = MEMBARRIER_CMD_QUERY, flags = 1;
35
36 if (sys_membarrier(cmd, flags) != -1) {
e67f85fb
SK
37 ksft_exit_fail_msg(
38 "sys membarrier MEMBARRIER_CMD_QUERY invalid flags test: flags = %d. Should fail, but passed\n",
39 flags);
b6d97344 40 }
326f57a4 41
e67f85fb
SK
42 ksft_test_result_pass(
43 "sys membarrier MEMBARRIER_CMD_QUERY invalid flags test: flags = %d. Failed as expected\n",
44 flags);
45 return 0;
b6d97344
PK
46}
47
e67f85fb 48static int test_membarrier_success(void)
b6d97344 49{
c9946c42 50 int cmd = MEMBARRIER_CMD_SHARED, flags = 0;
e67f85fb 51 const char *test_name = "sys membarrier MEMBARRIER_CMD_SHARED\n";
b6d97344 52
c9946c42 53 if (sys_membarrier(cmd, flags) != 0) {
e67f85fb
SK
54 ksft_exit_fail_msg(
55 "sys membarrier MEMBARRIER_CMD_SHARED test: flags = %d\n",
56 flags);
b6d97344
PK
57 }
58
e67f85fb
SK
59 ksft_test_result_pass(
60 "sys membarrier MEMBARRIER_CMD_SHARED test: flags = %d\n",
61 flags);
62 return 0;
b6d97344
PK
63}
64
e67f85fb 65static int test_membarrier(void)
b6d97344 66{
e67f85fb 67 int status;
c9946c42
MD
68
69 status = test_membarrier_cmd_fail();
70 if (status)
71 return status;
72 status = test_membarrier_flags_fail();
73 if (status)
74 return status;
75 status = test_membarrier_success();
76 if (status)
77 return status;
e67f85fb 78 return 0;
b6d97344
PK
79}
80
e67f85fb 81static int test_membarrier_query(void)
b6d97344 82{
c9946c42 83 int flags = 0, ret;
b6d97344 84
c9946c42
MD
85 ret = sys_membarrier(MEMBARRIER_CMD_QUERY, flags);
86 if (ret < 0) {
326f57a4 87 if (errno == ENOSYS) {
c9946c42
MD
88 /*
89 * It is valid to build a kernel with
90 * CONFIG_MEMBARRIER=n. However, this skips the tests.
91 */
e67f85fb
SK
92 ksft_exit_skip(
93 "sys membarrier (CONFIG_MEMBARRIER) is disabled.\n");
c9946c42 94 }
e67f85fb 95 ksft_exit_fail_msg("sys_membarrier() failed\n");
c9946c42 96 }
e67f85fb
SK
97 if (!(ret & MEMBARRIER_CMD_SHARED))
98 ksft_exit_fail_msg("sys_membarrier is not supported.\n");
99
100 ksft_test_result_pass("sys_membarrier available\n");
101 return 0;
b6d97344
PK
102}
103
104int main(int argc, char **argv)
105{
326f57a4 106 ksft_print_header();
b6d97344 107
e67f85fb
SK
108 test_membarrier_query();
109 test_membarrier();
110
111 ksft_exit_pass();
b6d97344 112}