aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2018-02-06 22:57:31 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2018-02-06 22:57:31 -0500
commitab2d92ad881da11331280aedf612d82e61cb6d41 (patch)
treeea1bc914b9dfc510b7ea7ec21219f0f831c442cc /tools
parent4b0dda4f86c5c87698f7228a4f65ef834dc79252 (diff)
parent82845079160817cc6ac64e5321bbd935e0a47b3a (diff)
Merge branch 'sched-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull scheduler updates from Ingo Molnar: - membarrier updates (Mathieu Desnoyers) - SMP balancing optimizations (Mel Gorman) - stats update optimizations (Peter Zijlstra) - RT scheduler race fixes (Steven Rostedt) - misc fixes and updates * 'sched-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: sched/fair: Use a recently used CPU as an idle candidate and the basis for SIS sched/fair: Do not migrate if the prev_cpu is idle sched/fair: Restructure wake_affine*() to return a CPU id sched/fair: Remove unnecessary parameters from wake_affine_idle() sched/rt: Make update_curr_rt() more accurate sched/rt: Up the root domain ref count when passing it around via IPIs sched/rt: Use container_of() to get root domain in rto_push_irq_work_func() sched/core: Optimize update_stats_*() sched/core: Optimize ttwu_stat() membarrier/selftest: Test private expedited sync core command membarrier/arm64: Provide core serializing command membarrier/x86: Provide core serializing command membarrier: Provide core serializing command, *_SYNC_CORE lockin/x86: Implement sync_core_before_usermode() locking: Introduce sync_core_before_usermode() membarrier/selftest: Test global expedited command membarrier: Provide GLOBAL_EXPEDITED command membarrier: Document scheduler barrier requirements powerpc, membarrier: Skip memory barrier in switch_mm() membarrier/selftest: Test private expedited command
Diffstat (limited to 'tools')
-rw-r--r--tools/testing/selftests/membarrier/membarrier_test.c237
1 files changed, 219 insertions, 18 deletions
diff --git a/tools/testing/selftests/membarrier/membarrier_test.c b/tools/testing/selftests/membarrier/membarrier_test.c
index 9e674d9514d1..22bffd55a523 100644
--- a/tools/testing/selftests/membarrier/membarrier_test.c
+++ b/tools/testing/selftests/membarrier/membarrier_test.c
@@ -16,49 +16,210 @@ static int sys_membarrier(int cmd, int flags)
16static int test_membarrier_cmd_fail(void) 16static int test_membarrier_cmd_fail(void)
17{ 17{
18 int cmd = -1, flags = 0; 18 int cmd = -1, flags = 0;
19 const char *test_name = "sys membarrier invalid command";
19 20
20 if (sys_membarrier(cmd, flags) != -1) { 21 if (sys_membarrier(cmd, flags) != -1) {
21 ksft_exit_fail_msg( 22 ksft_exit_fail_msg(
22 "sys membarrier invalid command test: command = %d, flags = %d. Should fail, but passed\n", 23 "%s test: command = %d, flags = %d. Should fail, but passed\n",
23 cmd, flags); 24 test_name, cmd, flags);
25 }
26 if (errno != EINVAL) {
27 ksft_exit_fail_msg(
28 "%s test: flags = %d. Should return (%d: \"%s\"), but returned (%d: \"%s\").\n",
29 test_name, flags, EINVAL, strerror(EINVAL),
30 errno, strerror(errno));
24 } 31 }
25 32
26 ksft_test_result_pass( 33 ksft_test_result_pass(
27 "sys membarrier invalid command test: command = %d, flags = %d. Failed as expected\n", 34 "%s test: command = %d, flags = %d, errno = %d. Failed as expected\n",
28 cmd, flags); 35 test_name, cmd, flags, errno);
29 return 0; 36 return 0;
30} 37}
31 38
32static int test_membarrier_flags_fail(void) 39static int test_membarrier_flags_fail(void)
33{ 40{
34 int cmd = MEMBARRIER_CMD_QUERY, flags = 1; 41 int cmd = MEMBARRIER_CMD_QUERY, flags = 1;
42 const char *test_name = "sys membarrier MEMBARRIER_CMD_QUERY invalid flags";
43
44 if (sys_membarrier(cmd, flags) != -1) {
45 ksft_exit_fail_msg(
46 "%s test: flags = %d. Should fail, but passed\n",
47 test_name, flags);
48 }
49 if (errno != EINVAL) {
50 ksft_exit_fail_msg(
51 "%s test: flags = %d. Should return (%d: \"%s\"), but returned (%d: \"%s\").\n",
52 test_name, flags, EINVAL, strerror(EINVAL),
53 errno, strerror(errno));
54 }
55
56 ksft_test_result_pass(
57 "%s test: flags = %d, errno = %d. Failed as expected\n",
58 test_name, flags, errno);
59 return 0;
60}
61
62static int test_membarrier_global_success(void)
63{
64 int cmd = MEMBARRIER_CMD_GLOBAL, flags = 0;
65 const char *test_name = "sys membarrier MEMBARRIER_CMD_GLOBAL";
66
67 if (sys_membarrier(cmd, flags) != 0) {
68 ksft_exit_fail_msg(
69 "%s test: flags = %d, errno = %d\n",
70 test_name, flags, errno);
71 }
72
73 ksft_test_result_pass(
74 "%s test: flags = %d\n", test_name, flags);
75 return 0;
76}
77
78static int test_membarrier_private_expedited_fail(void)
79{
80 int cmd = MEMBARRIER_CMD_PRIVATE_EXPEDITED, flags = 0;
81 const char *test_name = "sys membarrier MEMBARRIER_CMD_PRIVATE_EXPEDITED not registered failure";
82
83 if (sys_membarrier(cmd, flags) != -1) {
84 ksft_exit_fail_msg(
85 "%s test: flags = %d. Should fail, but passed\n",
86 test_name, flags);
87 }
88 if (errno != EPERM) {
89 ksft_exit_fail_msg(
90 "%s test: flags = %d. Should return (%d: \"%s\"), but returned (%d: \"%s\").\n",
91 test_name, flags, EPERM, strerror(EPERM),
92 errno, strerror(errno));
93 }
94
95 ksft_test_result_pass(
96 "%s test: flags = %d, errno = %d\n",
97 test_name, flags, errno);
98 return 0;
99}
100
101static int test_membarrier_register_private_expedited_success(void)
102{
103 int cmd = MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED, flags = 0;
104 const char *test_name = "sys membarrier MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED";
105
106 if (sys_membarrier(cmd, flags) != 0) {
107 ksft_exit_fail_msg(
108 "%s test: flags = %d, errno = %d\n",
109 test_name, flags, errno);
110 }
111
112 ksft_test_result_pass(
113 "%s test: flags = %d\n",
114 test_name, flags);
115 return 0;
116}
117
118static int test_membarrier_private_expedited_success(void)
119{
120 int cmd = MEMBARRIER_CMD_PRIVATE_EXPEDITED, flags = 0;
121 const char *test_name = "sys membarrier MEMBARRIER_CMD_PRIVATE_EXPEDITED";
122
123 if (sys_membarrier(cmd, flags) != 0) {
124 ksft_exit_fail_msg(
125 "%s test: flags = %d, errno = %d\n",
126 test_name, flags, errno);
127 }
128
129 ksft_test_result_pass(
130 "%s test: flags = %d\n",
131 test_name, flags);
132 return 0;
133}
134
135static int test_membarrier_private_expedited_sync_core_fail(void)
136{
137 int cmd = MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE, flags = 0;
138 const char *test_name = "sys membarrier MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE not registered failure";
35 139
36 if (sys_membarrier(cmd, flags) != -1) { 140 if (sys_membarrier(cmd, flags) != -1) {
37 ksft_exit_fail_msg( 141 ksft_exit_fail_msg(
38 "sys membarrier MEMBARRIER_CMD_QUERY invalid flags test: flags = %d. Should fail, but passed\n", 142 "%s test: flags = %d. Should fail, but passed\n",
39 flags); 143 test_name, flags);
144 }
145 if (errno != EPERM) {
146 ksft_exit_fail_msg(
147 "%s test: flags = %d. Should return (%d: \"%s\"), but returned (%d: \"%s\").\n",
148 test_name, flags, EPERM, strerror(EPERM),
149 errno, strerror(errno));
150 }
151
152 ksft_test_result_pass(
153 "%s test: flags = %d, errno = %d\n",
154 test_name, flags, errno);
155 return 0;
156}
157
158static int test_membarrier_register_private_expedited_sync_core_success(void)
159{
160 int cmd = MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE, flags = 0;
161 const char *test_name = "sys membarrier MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE";
162
163 if (sys_membarrier(cmd, flags) != 0) {
164 ksft_exit_fail_msg(
165 "%s test: flags = %d, errno = %d\n",
166 test_name, flags, errno);
167 }
168
169 ksft_test_result_pass(
170 "%s test: flags = %d\n",
171 test_name, flags);
172 return 0;
173}
174
175static int test_membarrier_private_expedited_sync_core_success(void)
176{
177 int cmd = MEMBARRIER_CMD_PRIVATE_EXPEDITED, flags = 0;
178 const char *test_name = "sys membarrier MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE";
179
180 if (sys_membarrier(cmd, flags) != 0) {
181 ksft_exit_fail_msg(
182 "%s test: flags = %d, errno = %d\n",
183 test_name, flags, errno);
40 } 184 }
41 185
42 ksft_test_result_pass( 186 ksft_test_result_pass(
43 "sys membarrier MEMBARRIER_CMD_QUERY invalid flags test: flags = %d. Failed as expected\n", 187 "%s test: flags = %d\n",
44 flags); 188 test_name, flags);
45 return 0; 189 return 0;
46} 190}
47 191
48static int test_membarrier_success(void) 192static int test_membarrier_register_global_expedited_success(void)
49{ 193{
50 int cmd = MEMBARRIER_CMD_SHARED, flags = 0; 194 int cmd = MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED, flags = 0;
51 const char *test_name = "sys membarrier MEMBARRIER_CMD_SHARED\n"; 195 const char *test_name = "sys membarrier MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED";
52 196
53 if (sys_membarrier(cmd, flags) != 0) { 197 if (sys_membarrier(cmd, flags) != 0) {
54 ksft_exit_fail_msg( 198 ksft_exit_fail_msg(
55 "sys membarrier MEMBARRIER_CMD_SHARED test: flags = %d\n", 199 "%s test: flags = %d, errno = %d\n",
56 flags); 200 test_name, flags, errno);
57 } 201 }
58 202
59 ksft_test_result_pass( 203 ksft_test_result_pass(
60 "sys membarrier MEMBARRIER_CMD_SHARED test: flags = %d\n", 204 "%s test: flags = %d\n",
61 flags); 205 test_name, flags);
206 return 0;
207}
208
209static int test_membarrier_global_expedited_success(void)
210{
211 int cmd = MEMBARRIER_CMD_GLOBAL_EXPEDITED, flags = 0;
212 const char *test_name = "sys membarrier MEMBARRIER_CMD_GLOBAL_EXPEDITED";
213
214 if (sys_membarrier(cmd, flags) != 0) {
215 ksft_exit_fail_msg(
216 "%s test: flags = %d, errno = %d\n",
217 test_name, flags, errno);
218 }
219
220 ksft_test_result_pass(
221 "%s test: flags = %d\n",
222 test_name, flags);
62 return 0; 223 return 0;
63} 224}
64 225
@@ -72,7 +233,45 @@ static int test_membarrier(void)
72 status = test_membarrier_flags_fail(); 233 status = test_membarrier_flags_fail();
73 if (status) 234 if (status)
74 return status; 235 return status;
75 status = test_membarrier_success(); 236 status = test_membarrier_global_success();
237 if (status)
238 return status;
239 status = test_membarrier_private_expedited_fail();
240 if (status)
241 return status;
242 status = test_membarrier_register_private_expedited_success();
243 if (status)
244 return status;
245 status = test_membarrier_private_expedited_success();
246 if (status)
247 return status;
248 status = sys_membarrier(MEMBARRIER_CMD_QUERY, 0);
249 if (status < 0) {
250 ksft_test_result_fail("sys_membarrier() failed\n");
251 return status;
252 }
253 if (status & MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE) {
254 status = test_membarrier_private_expedited_sync_core_fail();
255 if (status)
256 return status;
257 status = test_membarrier_register_private_expedited_sync_core_success();
258 if (status)
259 return status;
260 status = test_membarrier_private_expedited_sync_core_success();
261 if (status)
262 return status;
263 }
264 /*
265 * It is valid to send a global membarrier from a non-registered
266 * process.
267 */
268 status = test_membarrier_global_expedited_success();
269 if (status)
270 return status;
271 status = test_membarrier_register_global_expedited_success();
272 if (status)
273 return status;
274 status = test_membarrier_global_expedited_success();
76 if (status) 275 if (status)
77 return status; 276 return status;
78 return 0; 277 return 0;
@@ -94,8 +293,10 @@ static int test_membarrier_query(void)
94 } 293 }
95 ksft_exit_fail_msg("sys_membarrier() failed\n"); 294 ksft_exit_fail_msg("sys_membarrier() failed\n");
96 } 295 }
97 if (!(ret & MEMBARRIER_CMD_SHARED)) 296 if (!(ret & MEMBARRIER_CMD_GLOBAL)) {
297 ksft_test_result_fail("sys_membarrier() CMD_GLOBAL query failed\n");
98 ksft_exit_fail_msg("sys_membarrier is not supported.\n"); 298 ksft_exit_fail_msg("sys_membarrier is not supported.\n");
299 }
99 300
100 ksft_test_result_pass("sys_membarrier available\n"); 301 ksft_test_result_pass("sys_membarrier available\n");
101 return 0; 302 return 0;
@@ -108,5 +309,5 @@ int main(int argc, char **argv)
108 test_membarrier_query(); 309 test_membarrier_query();
109 test_membarrier(); 310 test_membarrier();
110 311
111 ksft_exit_pass(); 312 return ksft_exit_pass();
112} 313}