aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>2015-09-11 16:07:45 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2015-09-11 18:21:34 -0400
commitc9946c4208a3725e116c05180d93154eb406d451 (patch)
treecad660df31c23963e625e01bc531d3591b21bd04 /tools
parentb6d973441675222a4e6c8cad8208c2fe098a0b25 (diff)
selftests: enhance membarrier syscall test
Update the membarrier syscall self-test to match the membarrier interface. Extend coverage of the interface. Consider ENOSYS as a "SKIP" test, since it is a valid configuration, but does not allow testing the system call. Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Cc: Michael Ellerman <mpe@ellerman.id.au> Cc: Pranith Kumar <bobby.prani@gmail.com> Cc: Shuah Khan <shuahkh@osg.samsung.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'tools')
-rw-r--r--tools/testing/selftests/membarrier/membarrier_test.c100
1 files changed, 75 insertions, 25 deletions
diff --git a/tools/testing/selftests/membarrier/membarrier_test.c b/tools/testing/selftests/membarrier/membarrier_test.c
index 3c9f2179acd8..dde312508007 100644
--- a/tools/testing/selftests/membarrier/membarrier_test.c
+++ b/tools/testing/selftests/membarrier/membarrier_test.c
@@ -10,62 +10,112 @@
10 10
11#include "../kselftest.h" 11#include "../kselftest.h"
12 12
13enum test_membarrier_status {
14 TEST_MEMBARRIER_PASS = 0,
15 TEST_MEMBARRIER_FAIL,
16 TEST_MEMBARRIER_SKIP,
17};
18
13static int sys_membarrier(int cmd, int flags) 19static int sys_membarrier(int cmd, int flags)
14{ 20{
15 return syscall(__NR_membarrier, cmd, flags); 21 return syscall(__NR_membarrier, cmd, flags);
16} 22}
17 23
18static void test_membarrier_fail(void) 24static enum test_membarrier_status test_membarrier_cmd_fail(void)
19{ 25{
20 int cmd = -1, flags = 0; 26 int cmd = -1, flags = 0;
21 27
22 if (sys_membarrier(cmd, flags) != -1) { 28 if (sys_membarrier(cmd, flags) != -1) {
23 printf("membarrier: Should fail but passed\n"); 29 printf("membarrier: Wrong command should fail but passed.\n");
24 ksft_exit_fail(); 30 return TEST_MEMBARRIER_FAIL;
31 }
32 return TEST_MEMBARRIER_PASS;
33}
34
35static enum test_membarrier_status test_membarrier_flags_fail(void)
36{
37 int cmd = MEMBARRIER_CMD_QUERY, flags = 1;
38
39 if (sys_membarrier(cmd, flags) != -1) {
40 printf("membarrier: Wrong flags should fail but passed.\n");
41 return TEST_MEMBARRIER_FAIL;
25 } 42 }
43 return TEST_MEMBARRIER_PASS;
26} 44}
27 45
28static void test_membarrier_success(void) 46static enum test_membarrier_status test_membarrier_success(void)
29{ 47{
30 int flags = 0; 48 int cmd = MEMBARRIER_CMD_SHARED, flags = 0;
31 49
32 if (sys_membarrier(MEMBARRIER_CMD_SHARED, flags) != 0) { 50 if (sys_membarrier(cmd, flags) != 0) {
33 printf("membarrier: Executing MEMBARRIER failed, %s\n", 51 printf("membarrier: Executing MEMBARRIER_CMD_SHARED failed. %s.\n",
34 strerror(errno)); 52 strerror(errno));
35 ksft_exit_fail(); 53 return TEST_MEMBARRIER_FAIL;
36 } 54 }
37 55
38 printf("membarrier: MEMBARRIER_CMD_SHARED success\n"); 56 printf("membarrier: MEMBARRIER_CMD_SHARED success.\n");
57 return TEST_MEMBARRIER_PASS;
39} 58}
40 59
41static void test_membarrier(void) 60static enum test_membarrier_status test_membarrier(void)
42{ 61{
43 test_membarrier_fail(); 62 enum test_membarrier_status status;
44 test_membarrier_success(); 63
64 status = test_membarrier_cmd_fail();
65 if (status)
66 return status;
67 status = test_membarrier_flags_fail();
68 if (status)
69 return status;
70 status = test_membarrier_success();
71 if (status)
72 return status;
73 return TEST_MEMBARRIER_PASS;
45} 74}
46 75
47static int test_membarrier_exists(void) 76static enum test_membarrier_status test_membarrier_query(void)
48{ 77{
49 int flags = 0; 78 int flags = 0, ret;
50
51 if (sys_membarrier(MEMBARRIER_CMD_QUERY, flags))
52 return 0;
53 79
54 return 1; 80 printf("membarrier MEMBARRIER_CMD_QUERY ");
81 ret = sys_membarrier(MEMBARRIER_CMD_QUERY, flags);
82 if (ret < 0) {
83 printf("failed. %s.\n", strerror(errno));
84 switch (errno) {
85 case ENOSYS:
86 /*
87 * It is valid to build a kernel with
88 * CONFIG_MEMBARRIER=n. However, this skips the tests.
89 */
90 return TEST_MEMBARRIER_SKIP;
91 case EINVAL:
92 default:
93 return TEST_MEMBARRIER_FAIL;
94 }
95 }
96 if (!(ret & MEMBARRIER_CMD_SHARED)) {
97 printf("command MEMBARRIER_CMD_SHARED is not supported.\n");
98 return TEST_MEMBARRIER_FAIL;
99 }
100 printf("syscall available.\n");
101 return TEST_MEMBARRIER_PASS;
55} 102}
56 103
57int main(int argc, char **argv) 104int main(int argc, char **argv)
58{ 105{
59 printf("membarrier: MEMBARRIER_CMD_QUERY "); 106 switch (test_membarrier_query()) {
60 if (test_membarrier_exists()) { 107 case TEST_MEMBARRIER_FAIL:
61 printf("syscall implemented\n");
62 test_membarrier();
63 } else {
64 printf("syscall not implemented!\n");
65 return ksft_exit_fail(); 108 return ksft_exit_fail();
109 case TEST_MEMBARRIER_SKIP:
110 return ksft_exit_skip();
111 }
112 switch (test_membarrier()) {
113 case TEST_MEMBARRIER_FAIL:
114 return ksft_exit_fail();
115 case TEST_MEMBARRIER_SKIP:
116 return ksft_exit_skip();
66 } 117 }
67 118
68 printf("membarrier: tests done!\n"); 119 printf("membarrier: tests done!\n");
69
70 return ksft_exit_pass(); 120 return ksft_exit_pass();
71} 121}