diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2018-02-06 22:57:31 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2018-02-06 22:57:31 -0500 |
commit | ab2d92ad881da11331280aedf612d82e61cb6d41 (patch) | |
tree | ea1bc914b9dfc510b7ea7ec21219f0f831c442cc /tools | |
parent | 4b0dda4f86c5c87698f7228a4f65ef834dc79252 (diff) | |
parent | 82845079160817cc6ac64e5321bbd935e0a47b3a (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.c | 237 |
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) | |||
16 | static int test_membarrier_cmd_fail(void) | 16 | static 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 | ||
32 | static int test_membarrier_flags_fail(void) | 39 | static 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 | |||
62 | static 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 | |||
78 | static 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 | |||
101 | static 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 | |||
118 | static 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 | |||
135 | static 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 | |||
158 | static 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 | |||
175 | static 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 | ||
48 | static int test_membarrier_success(void) | 192 | static 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 | |||
209 | static 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 | } |