Pranith Kumar | b6d9734 | 2015-09-11 13:07:42 -0700 | [diff] [blame] | 1 | #define _GNU_SOURCE |
Pranith Kumar | b6d9734 | 2015-09-11 13:07:42 -0700 | [diff] [blame] | 2 | #include <linux/membarrier.h> |
Mathieu Desnoyers | 7a07b50 | 2015-09-22 14:59:20 -0700 | [diff] [blame] | 3 | #include <syscall.h> |
Pranith Kumar | b6d9734 | 2015-09-11 13:07:42 -0700 | [diff] [blame] | 4 | #include <stdio.h> |
| 5 | #include <errno.h> |
| 6 | #include <string.h> |
| 7 | |
| 8 | #include "../kselftest.h" |
| 9 | |
| 10 | static int sys_membarrier(int cmd, int flags) |
| 11 | { |
| 12 | return syscall(__NR_membarrier, cmd, flags); |
| 13 | } |
| 14 | |
Shuah Khan | e67f85f | 2017-06-29 16:54:57 -0600 | [diff] [blame^] | 15 | static int test_membarrier_cmd_fail(void) |
Pranith Kumar | b6d9734 | 2015-09-11 13:07:42 -0700 | [diff] [blame] | 16 | { |
| 17 | int cmd = -1, flags = 0; |
| 18 | |
| 19 | if (sys_membarrier(cmd, flags) != -1) { |
Shuah Khan | e67f85f | 2017-06-29 16:54:57 -0600 | [diff] [blame^] | 20 | ksft_exit_fail_msg( |
| 21 | "sys membarrier invalid command test: command = %d, flags = %d. Should fail, but passed\n", |
| 22 | cmd, flags); |
Pranith Kumar | b6d9734 | 2015-09-11 13:07:42 -0700 | [diff] [blame] | 23 | } |
Paul Elder | 326f57a | 2017-06-12 08:56:48 +0200 | [diff] [blame] | 24 | |
Shuah Khan | e67f85f | 2017-06-29 16:54:57 -0600 | [diff] [blame^] | 25 | 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 Kumar | b6d9734 | 2015-09-11 13:07:42 -0700 | [diff] [blame] | 29 | } |
| 30 | |
Shuah Khan | e67f85f | 2017-06-29 16:54:57 -0600 | [diff] [blame^] | 31 | static int test_membarrier_flags_fail(void) |
Pranith Kumar | b6d9734 | 2015-09-11 13:07:42 -0700 | [diff] [blame] | 32 | { |
Mathieu Desnoyers | c9946c4 | 2015-09-11 13:07:45 -0700 | [diff] [blame] | 33 | int cmd = MEMBARRIER_CMD_QUERY, flags = 1; |
Pranith Kumar | b6d9734 | 2015-09-11 13:07:42 -0700 | [diff] [blame] | 34 | |
Mathieu Desnoyers | c9946c4 | 2015-09-11 13:07:45 -0700 | [diff] [blame] | 35 | if (sys_membarrier(cmd, flags) != -1) { |
Shuah Khan | e67f85f | 2017-06-29 16:54:57 -0600 | [diff] [blame^] | 36 | ksft_exit_fail_msg( |
| 37 | "sys membarrier MEMBARRIER_CMD_QUERY invalid flags test: flags = %d. Should fail, but passed\n", |
| 38 | flags); |
Mathieu Desnoyers | c9946c4 | 2015-09-11 13:07:45 -0700 | [diff] [blame] | 39 | } |
Paul Elder | 326f57a | 2017-06-12 08:56:48 +0200 | [diff] [blame] | 40 | |
Shuah Khan | e67f85f | 2017-06-29 16:54:57 -0600 | [diff] [blame^] | 41 | 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 Desnoyers | c9946c4 | 2015-09-11 13:07:45 -0700 | [diff] [blame] | 45 | } |
| 46 | |
Shuah Khan | e67f85f | 2017-06-29 16:54:57 -0600 | [diff] [blame^] | 47 | static int test_membarrier_success(void) |
Mathieu Desnoyers | c9946c4 | 2015-09-11 13:07:45 -0700 | [diff] [blame] | 48 | { |
| 49 | int cmd = MEMBARRIER_CMD_SHARED, flags = 0; |
Shuah Khan | e67f85f | 2017-06-29 16:54:57 -0600 | [diff] [blame^] | 50 | const char *test_name = "sys membarrier MEMBARRIER_CMD_SHARED\n"; |
Mathieu Desnoyers | c9946c4 | 2015-09-11 13:07:45 -0700 | [diff] [blame] | 51 | |
| 52 | if (sys_membarrier(cmd, flags) != 0) { |
Shuah Khan | e67f85f | 2017-06-29 16:54:57 -0600 | [diff] [blame^] | 53 | ksft_exit_fail_msg( |
| 54 | "sys membarrier MEMBARRIER_CMD_SHARED test: flags = %d\n", |
| 55 | flags); |
Pranith Kumar | b6d9734 | 2015-09-11 13:07:42 -0700 | [diff] [blame] | 56 | } |
| 57 | |
Shuah Khan | e67f85f | 2017-06-29 16:54:57 -0600 | [diff] [blame^] | 58 | ksft_test_result_pass( |
| 59 | "sys membarrier MEMBARRIER_CMD_SHARED test: flags = %d\n", |
| 60 | flags); |
| 61 | return 0; |
Pranith Kumar | b6d9734 | 2015-09-11 13:07:42 -0700 | [diff] [blame] | 62 | } |
| 63 | |
Shuah Khan | e67f85f | 2017-06-29 16:54:57 -0600 | [diff] [blame^] | 64 | static int test_membarrier(void) |
Pranith Kumar | b6d9734 | 2015-09-11 13:07:42 -0700 | [diff] [blame] | 65 | { |
Shuah Khan | e67f85f | 2017-06-29 16:54:57 -0600 | [diff] [blame^] | 66 | int status; |
Mathieu Desnoyers | c9946c4 | 2015-09-11 13:07:45 -0700 | [diff] [blame] | 67 | |
| 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 Khan | e67f85f | 2017-06-29 16:54:57 -0600 | [diff] [blame^] | 77 | return 0; |
Pranith Kumar | b6d9734 | 2015-09-11 13:07:42 -0700 | [diff] [blame] | 78 | } |
| 79 | |
Shuah Khan | e67f85f | 2017-06-29 16:54:57 -0600 | [diff] [blame^] | 80 | static int test_membarrier_query(void) |
Pranith Kumar | b6d9734 | 2015-09-11 13:07:42 -0700 | [diff] [blame] | 81 | { |
Mathieu Desnoyers | c9946c4 | 2015-09-11 13:07:45 -0700 | [diff] [blame] | 82 | int flags = 0, ret; |
Pranith Kumar | b6d9734 | 2015-09-11 13:07:42 -0700 | [diff] [blame] | 83 | |
Mathieu Desnoyers | c9946c4 | 2015-09-11 13:07:45 -0700 | [diff] [blame] | 84 | ret = sys_membarrier(MEMBARRIER_CMD_QUERY, flags); |
| 85 | if (ret < 0) { |
Paul Elder | 326f57a | 2017-06-12 08:56:48 +0200 | [diff] [blame] | 86 | if (errno == ENOSYS) { |
Mathieu Desnoyers | c9946c4 | 2015-09-11 13:07:45 -0700 | [diff] [blame] | 87 | /* |
| 88 | * It is valid to build a kernel with |
| 89 | * CONFIG_MEMBARRIER=n. However, this skips the tests. |
| 90 | */ |
Shuah Khan | e67f85f | 2017-06-29 16:54:57 -0600 | [diff] [blame^] | 91 | ksft_exit_skip( |
| 92 | "sys membarrier (CONFIG_MEMBARRIER) is disabled.\n"); |
Mathieu Desnoyers | c9946c4 | 2015-09-11 13:07:45 -0700 | [diff] [blame] | 93 | } |
Shuah Khan | e67f85f | 2017-06-29 16:54:57 -0600 | [diff] [blame^] | 94 | ksft_exit_fail_msg("sys_membarrier() failed\n"); |
Mathieu Desnoyers | c9946c4 | 2015-09-11 13:07:45 -0700 | [diff] [blame] | 95 | } |
Shuah Khan | e67f85f | 2017-06-29 16:54:57 -0600 | [diff] [blame^] | 96 | 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 Kumar | b6d9734 | 2015-09-11 13:07:42 -0700 | [diff] [blame] | 101 | } |
| 102 | |
| 103 | int main(int argc, char **argv) |
| 104 | { |
Paul Elder | 326f57a | 2017-06-12 08:56:48 +0200 | [diff] [blame] | 105 | ksft_print_header(); |
Pranith Kumar | b6d9734 | 2015-09-11 13:07:42 -0700 | [diff] [blame] | 106 | |
Shuah Khan | e67f85f | 2017-06-29 16:54:57 -0600 | [diff] [blame^] | 107 | test_membarrier_query(); |
| 108 | test_membarrier(); |
| 109 | |
| 110 | ksft_exit_pass(); |
Pranith Kumar | b6d9734 | 2015-09-11 13:07:42 -0700 | [diff] [blame] | 111 | } |