Skip to content

Commit c9946c4

Browse files
compudjtorvalds
authored andcommitted
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>
1 parent b6d9734 commit c9946c4

File tree

1 file changed

+75
-25
lines changed

1 file changed

+75
-25
lines changed

tools/testing/selftests/membarrier/membarrier_test.c

Lines changed: 75 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -10,62 +10,112 @@
1010

1111
#include "../kselftest.h"
1212

13+
enum test_membarrier_status {
14+
TEST_MEMBARRIER_PASS = 0,
15+
TEST_MEMBARRIER_FAIL,
16+
TEST_MEMBARRIER_SKIP,
17+
};
18+
1319
static int sys_membarrier(int cmd, int flags)
1420
{
1521
return syscall(__NR_membarrier, cmd, flags);
1622
}
1723

18-
static void test_membarrier_fail(void)
24+
static enum test_membarrier_status test_membarrier_cmd_fail(void)
1925
{
2026
int cmd = -1, flags = 0;
2127

2228
if (sys_membarrier(cmd, flags) != -1) {
23-
printf("membarrier: Should fail but passed\n");
24-
ksft_exit_fail();
29+
printf("membarrier: Wrong command should fail but passed.\n");
30+
return TEST_MEMBARRIER_FAIL;
31+
}
32+
return TEST_MEMBARRIER_PASS;
33+
}
34+
35+
static 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;
2542
}
43+
return TEST_MEMBARRIER_PASS;
2644
}
2745

28-
static void test_membarrier_success(void)
46+
static enum test_membarrier_status test_membarrier_success(void)
2947
{
30-
int flags = 0;
48+
int cmd = MEMBARRIER_CMD_SHARED, flags = 0;
3149

32-
if (sys_membarrier(MEMBARRIER_CMD_SHARED, flags) != 0) {
33-
printf("membarrier: Executing MEMBARRIER failed, %s\n",
50+
if (sys_membarrier(cmd, flags) != 0) {
51+
printf("membarrier: Executing MEMBARRIER_CMD_SHARED failed. %s.\n",
3452
strerror(errno));
35-
ksft_exit_fail();
53+
return TEST_MEMBARRIER_FAIL;
3654
}
3755

38-
printf("membarrier: MEMBARRIER_CMD_SHARED success\n");
56+
printf("membarrier: MEMBARRIER_CMD_SHARED success.\n");
57+
return TEST_MEMBARRIER_PASS;
3958
}
4059

41-
static void test_membarrier(void)
60+
static enum test_membarrier_status test_membarrier(void)
4261
{
43-
test_membarrier_fail();
44-
test_membarrier_success();
62+
enum test_membarrier_status status;
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;
4574
}
4675

47-
static int test_membarrier_exists(void)
76+
static enum test_membarrier_status test_membarrier_query(void)
4877
{
49-
int flags = 0;
50-
51-
if (sys_membarrier(MEMBARRIER_CMD_QUERY, flags))
52-
return 0;
78+
int flags = 0, ret;
5379

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;
55102
}
56103

57104
int main(int argc, char **argv)
58105
{
59-
printf("membarrier: MEMBARRIER_CMD_QUERY ");
60-
if (test_membarrier_exists()) {
61-
printf("syscall implemented\n");
62-
test_membarrier();
63-
} else {
64-
printf("syscall not implemented!\n");
106+
switch (test_membarrier_query()) {
107+
case TEST_MEMBARRIER_FAIL:
65108
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();
66117
}
67118

68119
printf("membarrier: tests done!\n");
69-
70120
return ksft_exit_pass();
71121
}

0 commit comments

Comments
 (0)