Fix: test: missing test plan for non-x86/arm platforms (i.e powerpc)
[lttng-tools.git] / tests / regression / kernel / test_select_poll_epoll
1 #!/bin/bash
2 #
3 # Copyright (C) 2016 Julien Desfossez <jdesfossez@efficios.com>
4 #
5 # SPDX-License-Identifier: GPL-2.0-only
6 #
7
8 TEST_DESC="Kernel tracer - select, poll and epoll payload extraction"
9
10 CURDIR=$(dirname "$0")/
11 TESTDIR=$CURDIR/../..
12 VALIDATE_SCRIPT="$CURDIR/validate_select_poll_epoll.py"
13 NUM_TESTS=102
14
15 # Only run this test on x86 and arm
16 uname -m | grep -E "x86|i686|arm|aarch64" >/dev/null 2>&1
17 if test $? != 0; then
18 plan_tests $NUM_TESTS
19 skip 0 "Run only on x86 and arm. Skipping all tests." $NUM_TESTS
20 exit 0
21 fi
22
23 DISABLE_VALIDATE=0
24 # Babeltrace python bindings are required for the validation, but
25 # it is not a mandatory dependancy of the project, so fail run the
26 # without the content validation, at least we test that we are not
27 # crashing the kernel.
28 $VALIDATE_SCRIPT --help >/dev/null 2>&1
29 if test $? != 0; then
30 echo "# Failed to run the validation script, Babeltrace Python bindings might be missing"
31 DISABLE_VALIDATE=1
32 fi
33
34 LAST_WARNING=$(dmesg | grep " WARNING:" | cut -d' ' -f1 | tail -1)
35 LAST_OOPS=$(dmesg | grep " OOPS:" | cut -d' ' -f1 | tail -1)
36 LAST_BUG=$(dmesg | grep " BUG:" | cut -d' ' -f1 | tail -1)
37
38 # shellcheck source=../../utils/utils.sh
39 source $TESTDIR/utils/utils.sh
40
41 function check_trace_content()
42 {
43 if test $DISABLE_VALIDATE == 1; then
44 ok 0 "Validation skipped"
45 return
46 fi
47
48 $VALIDATE_SCRIPT $@
49 if test $? = 0; then
50 ok 0 "Validation success"
51 else
52 fail "Validation"
53 fi
54 }
55
56 function test_working_cases()
57 {
58 SESSION_NAME="syscall_payload"
59 TRACE_PATH=$(mktemp --tmpdir -d "tmp.test_kernel_select_poll_epoll_${FUNCNAME[0]}_trace_path.XXXXXX")
60 TEST_VALIDATION_OUTPUT_PATH=$(mktemp --tmpdir -u "tmp.test_kernel_select_poll_epoll_${FUNCNAME[0]}_validation.XXXXXX")
61
62 # arm64 does not have epoll_wait
63 uname -m | grep -E "aarch64" >/dev/null 2>&1
64 if test $? = 0; then
65 SYSCALL_LIST="select,pselect6,poll,ppoll,epoll_ctl,epoll_pwait"
66 else
67 SYSCALL_LIST="select,pselect6,poll,ppoll,epoll_ctl,epoll_wait,epoll_pwait"
68 fi
69
70 diag "Working cases for select, pselect6, poll, ppoll and epoll, waiting for input"
71
72 create_lttng_session_ok $SESSION_NAME "$TRACE_PATH"
73
74 lttng_enable_kernel_syscall_ok $SESSION_NAME $SYSCALL_LIST
75 add_context_kernel_ok $SESSION_NAME channel0 pid
76
77 start_lttng_tracing_ok
78 yes | "$CURDIR"/select_poll_epoll --validation-file "$TEST_VALIDATION_OUTPUT_PATH" -t 1
79 stop_lttng_tracing_ok
80
81 validate_trace "$SYSCALL_LIST" "$TRACE_PATH"
82 check_trace_content -t 1 --validation-file "$TEST_VALIDATION_OUTPUT_PATH" "$TRACE_PATH"
83
84 destroy_lttng_session_ok $SESSION_NAME
85
86 rm -rf "$TRACE_PATH"
87 rm -f "$TEST_VALIDATION_OUTPUT_PATH"
88 }
89
90 function test_timeout_cases()
91 {
92 SESSION_NAME="syscall_payload"
93 TRACE_PATH=$(mktemp --tmpdir -d "tmp.test_kernel_select_poll_epoll_${FUNCNAME[0]}_trace_path.XXXXXX")
94 TEST_VALIDATION_OUTPUT_PATH=$(mktemp --tmpdir -u "tmp.test_kernel_select_poll_epoll_${FUNCNAME[0]}_validation.XXXXXX")
95
96 # arm64 does not have epoll_wait
97 uname -m | grep -E "aarch64" >/dev/null 2>&1
98 if test $? = 0; then
99 SYSCALL_LIST="select,pselect6,poll,ppoll,epoll_ctl,epoll_pwait"
100 else
101 SYSCALL_LIST="select,pselect6,poll,ppoll,epoll_ctl,epoll_wait,epoll_pwait"
102 fi
103
104 diag "Timeout cases (1ms) for select, pselect6, poll, ppoll and epoll"
105
106 create_lttng_session_ok $SESSION_NAME "$TRACE_PATH"
107
108 lttng_enable_kernel_syscall_ok $SESSION_NAME "$SYSCALL_LIST"
109 add_context_kernel_ok $SESSION_NAME channel0 pid
110
111 start_lttng_tracing_ok
112 yes | "$CURDIR"/select_poll_epoll --validation-file "$TEST_VALIDATION_OUTPUT_PATH" -t 2
113 stop_lttng_tracing_ok
114
115 validate_trace "$SYSCALL_LIST" "$TRACE_PATH"
116 check_trace_content -t 2 --validation-file "$TEST_VALIDATION_OUTPUT_PATH" "$TRACE_PATH" 2>/dev/null
117
118 destroy_lttng_session_ok $SESSION_NAME
119
120 rm -rf "$TRACE_PATH"
121 rm -f "$TEST_VALIDATION_OUTPUT_PATH"
122 }
123
124 function test_pselect_invalid_fd()
125 {
126 SESSION_NAME="syscall_payload"
127 SYSCALL_LIST="pselect6"
128 TRACE_PATH=$(mktemp --tmpdir -d "tmp.test_kernel_select_poll_epoll_${FUNCNAME[0]}_trace_path.XXXXXX")
129 TEST_VALIDATION_OUTPUT_PATH=$(mktemp --tmpdir -u "tmp.test_kernel_select_poll_epoll_${FUNCNAME[0]}_validation.XXXXXX")
130
131 diag "pselect with invalid FD"
132
133 create_lttng_session_ok $SESSION_NAME "$TRACE_PATH"
134
135 lttng_enable_kernel_syscall_ok $SESSION_NAME $SYSCALL_LIST
136 add_context_kernel_ok $SESSION_NAME channel0 pid
137
138 start_lttng_tracing_ok
139 yes | "$CURDIR"/select_poll_epoll --validation-file "$TEST_VALIDATION_OUTPUT_PATH" -t 3
140 stop_lttng_tracing_ok
141
142 validate_trace "$SYSCALL_LIST" "$TRACE_PATH"
143 check_trace_content -t 3 --validation-file "$TEST_VALIDATION_OUTPUT_PATH" "$TRACE_PATH" 2>/dev/null
144
145 destroy_lttng_session_ok $SESSION_NAME
146
147 rm -rf "$TRACE_PATH"
148 rm -f "$TEST_VALIDATION_OUTPUT_PATH"
149 }
150
151 function test_big_ppoll()
152 {
153 SESSION_NAME="syscall_payload"
154 SYSCALL_LIST="ppoll"
155 TRACE_PATH=$(mktemp --tmpdir -d "tmp.test_kernel_select_poll_epoll_${FUNCNAME[0]}_trace_path.XXXXXX")
156 TEST_VALIDATION_OUTPUT_PATH=$(mktemp --tmpdir -u "tmp.test_kernel_select_poll_epoll_${FUNCNAME[0]}_validation.XXXXXX")
157
158 diag "ppoll with 2047 FDs"
159
160 create_lttng_session_ok $SESSION_NAME "$TRACE_PATH"
161
162 lttng_enable_kernel_syscall_ok $SESSION_NAME $SYSCALL_LIST
163 add_context_kernel_ok $SESSION_NAME channel0 pid
164
165 start_lttng_tracing_ok
166 yes | "$CURDIR"/select_poll_epoll --validation-file "$TEST_VALIDATION_OUTPUT_PATH" -t 4
167 stop_lttng_tracing_ok
168
169 validate_trace "$SYSCALL_LIST" "$TRACE_PATH"
170 check_trace_content -t 4 --validation-file "$TEST_VALIDATION_OUTPUT_PATH" "$TRACE_PATH" 2>/dev/null
171
172 destroy_lttng_session_ok $SESSION_NAME
173
174 rm -rf "$TRACE_PATH"
175 rm -f "$TEST_VALIDATION_OUTPUT_PATH"
176 }
177
178 function test_ppoll_overflow()
179 {
180 SESSION_NAME="syscall_payload"
181 SYSCALL_LIST="ppoll"
182 TRACE_PATH=$(mktemp --tmpdir -d "tmp.test_kernel_select_poll_epoll_${FUNCNAME[0]}_trace_path.XXXXXX")
183 TEST_VALIDATION_OUTPUT_PATH=$(mktemp --tmpdir -u "tmp.test_kernel_select_poll_epoll_${FUNCNAME[0]}_validation.XXXXXX")
184
185 diag "ppoll buffer overflow, should segfault, waits for input"
186
187 create_lttng_session_ok $SESSION_NAME "$TRACE_PATH"
188
189 lttng_enable_kernel_syscall_ok $SESSION_NAME $SYSCALL_LIST
190 add_context_kernel_ok $SESSION_NAME channel0 pid
191
192 start_lttng_tracing_ok
193 diag "Expect segfaults"
194 yes | "$CURDIR"/select_poll_epoll --validation-file "$TEST_VALIDATION_OUTPUT_PATH" -t 5
195 stop_lttng_tracing_ok
196
197 validate_trace "$SYSCALL_LIST" "$TRACE_PATH"
198
199 check_trace_content -t 5 --validation-file "$TEST_VALIDATION_OUTPUT_PATH" "$TRACE_PATH" 2>/dev/null
200
201 destroy_lttng_session_ok $SESSION_NAME
202
203 rm -rf "$TRACE_PATH"
204 rm -f "$TEST_VALIDATION_OUTPUT_PATH"
205 }
206
207 function test_pselect_invalid_ptr()
208 {
209 SESSION_NAME="syscall_payload"
210 SYSCALL_LIST="pselect6"
211 TRACE_PATH=$(mktemp --tmpdir -d "tmp.test_kernel_select_poll_epoll_${FUNCNAME[0]}_trace_path.XXXXXX")
212 TEST_VALIDATION_OUTPUT_PATH=$(mktemp --tmpdir -u "tmp.test_kernel_select_poll_epoll_${FUNCNAME[0]}_validation.XXXXXX")
213
214 diag "pselect with invalid pointer, waits for input"
215
216 create_lttng_session_ok $SESSION_NAME "$TRACE_PATH"
217
218 lttng_enable_kernel_syscall_ok $SESSION_NAME $SYSCALL_LIST
219 add_context_kernel_ok $SESSION_NAME channel0 pid
220
221 start_lttng_tracing_ok
222 yes | "$CURDIR"/select_poll_epoll --validation-file "$TEST_VALIDATION_OUTPUT_PATH" -t 6
223 stop_lttng_tracing_ok
224
225 validate_trace "$SYSCALL_LIST" "$TRACE_PATH"
226 check_trace_content -t 6 --validation-file "$TEST_VALIDATION_OUTPUT_PATH" "$TRACE_PATH" 2>/dev/null
227
228 destroy_lttng_session_ok $SESSION_NAME
229
230 rm -rf "$TRACE_PATH"
231 rm -f "$TEST_VALIDATION_OUTPUT_PATH"
232 }
233
234 function test_ppoll_ulong_max()
235 {
236 SESSION_NAME="syscall_payload"
237 SYSCALL_LIST="ppoll"
238 TRACE_PATH=$(mktemp --tmpdir -d "tmp.test_kernel_select_poll_epoll_${FUNCNAME[0]}_trace_path.XXXXXX")
239 TEST_VALIDATION_OUTPUT_PATH=$(mktemp --tmpdir -u "tmp.test_kernel_select_poll_epoll_${FUNCNAME[0]}_validation.XXXXXX")
240
241 diag "ppoll with ulong_max fds, waits for input"
242
243 create_lttng_session_ok $SESSION_NAME "$TRACE_PATH"
244
245 lttng_enable_kernel_syscall_ok $SESSION_NAME $SYSCALL_LIST
246 add_context_kernel_ok $SESSION_NAME channel0 pid
247
248 start_lttng_tracing_ok
249 yes | "$CURDIR"/select_poll_epoll --validation-file "$TEST_VALIDATION_OUTPUT_PATH" -t 7
250 stop_lttng_tracing_ok
251
252 validate_trace "$SYSCALL_LIST" "$TRACE_PATH"
253 check_trace_content -t 7 --validation-file "$TEST_VALIDATION_OUTPUT_PATH" "$TRACE_PATH" 2>/dev/null
254
255 destroy_lttng_session_ok $SESSION_NAME
256
257 rm -rf "$TRACE_PATH"
258 rm -f "$TEST_VALIDATION_OUTPUT_PATH"
259 }
260
261 function test_epoll_pwait_invalid_ptr()
262 {
263 SESSION_NAME="syscall_payload"
264 SYSCALL_LIST="epoll_pwait"
265 TRACE_PATH=$(mktemp --tmpdir -d "tmp.test_kernel_select_poll_epoll_${FUNCNAME[0]}_trace_path.XXXXXX")
266 TEST_VALIDATION_OUTPUT_PATH=$(mktemp --tmpdir -u "tmp.test_kernel_select_poll_epoll_${FUNCNAME[0]}_validation.XXXXXX")
267
268 diag "epoll_pwait with invalid pointer, waits for input"
269
270 create_lttng_session_ok $SESSION_NAME "$TRACE_PATH"
271
272 lttng_enable_kernel_syscall_ok $SESSION_NAME $SYSCALL_LIST
273 add_context_kernel_ok $SESSION_NAME channel0 pid
274
275 start_lttng_tracing_ok
276 yes | "$CURDIR"/select_poll_epoll --validation-file "$TEST_VALIDATION_OUTPUT_PATH" -t 8
277 stop_lttng_tracing_ok
278
279 validate_trace "$SYSCALL_LIST" "$TRACE_PATH"
280 check_trace_content -t 8 --validation-file "$TEST_VALIDATION_OUTPUT_PATH" "$TRACE_PATH" 2>/dev/null
281
282 destroy_lttng_session_ok $SESSION_NAME
283
284 rm -rf "$TRACE_PATH"
285 rm -f "$TEST_VALIDATION_OUTPUT_PATH"
286 }
287
288 function test_epoll_pwait_int_max()
289 {
290 SESSION_NAME="syscall_payload"
291 SYSCALL_LIST="epoll_pwait"
292 TRACE_PATH=$(mktemp --tmpdir -d "tmp.test_kernel_select_poll_epoll_${FUNCNAME[0]}_trace_path.XXXXXX")
293 TEST_VALIDATION_OUTPUT_PATH=$(mktemp --tmpdir -u "tmp.test_kernel_select_poll_epoll_${FUNCNAME[0]}_validation.XXXXXX")
294
295 diag "epoll_pwait with maxevents set to INT_MAX, waits for input"
296
297 create_lttng_session_ok $SESSION_NAME "$TRACE_PATH"
298
299 lttng_enable_kernel_syscall_ok $SESSION_NAME $SYSCALL_LIST
300 add_context_kernel_ok $SESSION_NAME channel0 pid
301
302 start_lttng_tracing_ok
303 yes | "$CURDIR"/select_poll_epoll --validation-file "$TEST_VALIDATION_OUTPUT_PATH" -t 9
304 stop_lttng_tracing_ok
305
306 validate_trace "$SYSCALL_LIST" "$TRACE_PATH"
307 check_trace_content -t 9 --validation-file "$TEST_VALIDATION_OUTPUT_PATH" "$TRACE_PATH" 2>/dev/null
308
309 destroy_lttng_session_ok $SESSION_NAME
310
311 rm -rf "$TRACE_PATH"
312 rm -f "$TEST_VALIDATION_OUTPUT_PATH"
313 }
314
315 function test_ppoll_concurrent()
316 {
317 SESSION_NAME="syscall_payload"
318 SYSCALL_LIST="ppoll"
319 TRACE_PATH=$(mktemp --tmpdir -d "tmp.test_kernel_select_poll_epoll_${FUNCNAME[0]}_trace_path.XXXXXX")
320 TEST_VALIDATION_OUTPUT_PATH=$(mktemp --tmpdir -u "tmp.test_kernel_select_poll_epoll_${FUNCNAME[0]}_validation.XXXXXX")
321
322 diag "ppoll with concurrent updates of the structure from user-space, stress test (3000 iterations), waits for input + timeout 1ms"
323
324 create_lttng_session_ok $SESSION_NAME "$TRACE_PATH"
325
326 lttng_enable_kernel_syscall_ok $SESSION_NAME $SYSCALL_LIST
327 add_context_kernel_ok $SESSION_NAME channel0 pid
328
329 start_lttng_tracing_ok
330 yes | "$CURDIR"/select_poll_epoll --validation-file "$TEST_VALIDATION_OUTPUT_PATH" -t 10
331 stop_lttng_tracing_ok
332
333 validate_trace "$SYSCALL_LIST" "$TRACE_PATH"
334 check_trace_content -t 10 --validation-file "$TEST_VALIDATION_OUTPUT_PATH" "$TRACE_PATH" 2>/dev/null
335
336 destroy_lttng_session_ok $SESSION_NAME
337
338 rm -rf "$TRACE_PATH"
339 rm -f "$TEST_VALIDATION_OUTPUT_PATH"
340 }
341
342 function test_epoll_pwait_concurrent()
343 {
344 SESSION_NAME="syscall_payload"
345 SYSCALL_LIST="epoll_ctl,epoll_pwait"
346 TRACE_PATH=$(mktemp --tmpdir -d "tmp.test_kernel_select_poll_epoll_${FUNCNAME[0]}_trace_path.XXXXXX")
347 TEST_VALIDATION_OUTPUT_PATH=$(mktemp --tmpdir -u "tmp.test_kernel_select_poll_epoll_${FUNCNAME[0]}_validation.XXXXXX")
348
349 diag "epoll_pwait with concurrent munmap of the buffer from user-space, should randomly segfault, run multiple times, waits for input + timeout 1ms"
350
351 create_lttng_session_ok $SESSION_NAME "$TRACE_PATH"
352
353 lttng_enable_kernel_syscall_ok $SESSION_NAME $SYSCALL_LIST
354 add_context_kernel_ok $SESSION_NAME channel0 pid
355
356 start_lttng_tracing_ok
357 diag "Expect segfaults"
358 for i in $(seq 1 100); do
359 yes | "$CURDIR"/select_poll_epoll --validation-file "$TEST_VALIDATION_OUTPUT_PATH" -t 11
360 done
361 stop_lttng_tracing_ok
362
363 # epoll_wait is not always generated in the trace (stress test)
364 validate_trace "epoll_ctl" "$TRACE_PATH"
365 check_trace_content -t 11 --validation-file "$TEST_VALIDATION_OUTPUT_PATH" "$TRACE_PATH" 2>/dev/null
366
367 destroy_lttng_session_ok $SESSION_NAME
368
369 rm -rf "$TRACE_PATH"
370 rm -f "$TEST_VALIDATION_OUTPUT_PATH"
371 }
372
373 # MUST set TESTDIR before calling those functions
374 plan_tests $NUM_TESTS
375
376 print_test_banner "$TEST_DESC"
377
378 if [ "$(id -u)" == "0" ]; then
379 isroot=1
380 else
381 isroot=0
382 fi
383
384 skip $isroot "Root access is needed. Skipping all tests." $NUM_TESTS ||
385 {
386 validate_lttng_modules_present
387
388 start_lttng_sessiond
389
390 test_working_cases
391 test_timeout_cases
392 test_pselect_invalid_fd
393 test_big_ppoll
394 test_ppoll_overflow
395 test_pselect_invalid_ptr
396 test_ppoll_ulong_max
397 test_epoll_pwait_invalid_ptr
398 test_epoll_pwait_int_max
399 test_ppoll_concurrent
400 test_epoll_pwait_concurrent
401
402 stop_lttng_sessiond
403
404 NEW_WARNING=$(dmesg | grep " WARNING:" | cut -d' ' -f1 | tail -1)
405 NEW_OOPS=$(dmesg | grep " OOPS:" | cut -d' ' -f1 | tail -1)
406 NEW_BUG=$(dmesg | grep " BUG:" | cut -d' ' -f1 | tail -1)
407
408 if test "$LAST_WARNING" != "$NEW_WARNING"; then
409 fail "New WARNING generated"
410 fi
411 if test "$LAST_OOPS" != "$NEW_OOPS"; then
412 fail "New OOPS generated"
413 fi
414 if test "$LAST_BUG" != "$NEW_BUG"; then
415 fail "New BUG generated"
416 fi
417 }
This page took 0.046755 seconds and 4 git commands to generate.