3 # Copyright (C) 2016 Julien Desfossez <jdesfossez@efficios.com>
5 # SPDX-License-Identifier: GPL-2.0-only
8 TEST_DESC
="Kernel tracer - select, poll and epoll payload extraction"
12 VALIDATE_SCRIPT
="$CURDIR/validate_select_poll_epoll.py"
15 # Only run this test on x86 and arm
16 uname
-m |
grep -E "x86|i686|arm|aarch64" >/dev
/null
2>&1
19 skip
0 "Run only on x86 and arm. Skipping all tests." $NUM_TESTS
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
30 echo "# Failed to run the validation script, Babeltrace Python bindings might be missing"
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)
38 source $TESTDIR/utils
/utils.sh
40 function check_trace_content
()
42 if test $DISABLE_VALIDATE == 1; then
43 ok
0 "Validation skipped"
49 ok
0 "Validation success"
55 function test_working_cases
()
57 TRACE_PATH
=$
(mktemp
-d)
58 SESSION_NAME
="syscall_payload"
60 # arm64 does not have epoll_wait
61 uname
-m |
grep -E "aarch64" >/dev
/null
2>&1
63 SYSCALL_LIST
="select,pselect6,poll,ppoll,epoll_ctl,epoll_pwait"
65 SYSCALL_LIST
="select,pselect6,poll,ppoll,epoll_ctl,epoll_wait,epoll_pwait"
68 diag
"Working cases for select, pselect6, poll, ppoll and epoll, waiting for input"
70 create_lttng_session_ok
$SESSION_NAME $TRACE_PATH
72 lttng_enable_kernel_syscall_ok
$SESSION_NAME $SYSCALL_LIST
73 add_context_kernel_ok
$SESSION_NAME channel0 pid
75 start_lttng_tracing_ok
76 { out
=$
(yes |
$CURDIR/select_poll_epoll
-t 1); } 2>/dev
/null
78 pid
=$
(echo $out | cut
-d' ' -f1)
80 validate_trace
"$SYSCALL_LIST" $TRACE_PATH
81 check_trace_content
-t 1 -p $pid $TRACE_PATH
83 destroy_lttng_session_ok
$SESSION_NAME
88 function test_timeout_cases
()
90 TRACE_PATH
=$
(mktemp
-d)
91 SESSION_NAME
="syscall_payload"
93 # arm64 does not have epoll_wait
94 uname
-m |
grep -E "aarch64" >/dev
/null
2>&1
96 SYSCALL_LIST
="select,pselect6,poll,ppoll,epoll_ctl,epoll_pwait"
98 SYSCALL_LIST
="select,pselect6,poll,ppoll,epoll_ctl,epoll_wait,epoll_pwait"
101 diag
"Timeout cases (1ms) for select, pselect6, poll, ppoll and epoll"
103 create_lttng_session_ok
$SESSION_NAME $TRACE_PATH
105 lttng_enable_kernel_syscall_ok
$SESSION_NAME "$SYSCALL_LIST"
106 add_context_kernel_ok
$SESSION_NAME channel0 pid
108 start_lttng_tracing_ok
109 { out
=$
($CURDIR/select_poll_epoll
-t 2); } 2>/dev
/null
110 stop_lttng_tracing_ok
111 pid
=$
(echo $out | cut
-d' ' -f1)
113 validate_trace
"$SYSCALL_LIST" $TRACE_PATH
114 check_trace_content
-t 2 -p $pid $TRACE_PATH 2>/dev
/null
116 destroy_lttng_session_ok
$SESSION_NAME
121 function test_pselect_invalid_fd
()
123 TRACE_PATH
=$
(mktemp
-d)
124 SESSION_NAME
="syscall_payload"
125 SYSCALL_LIST
="pselect6"
127 diag
"pselect with invalid FD"
129 create_lttng_session_ok
$SESSION_NAME $TRACE_PATH
131 lttng_enable_kernel_syscall_ok
$SESSION_NAME $SYSCALL_LIST
132 add_context_kernel_ok
$SESSION_NAME channel0 pid
134 start_lttng_tracing_ok
135 { out
=$
($CURDIR/select_poll_epoll
-t 3); } 2>/dev
/null
136 stop_lttng_tracing_ok
137 pid
=$
(echo $out | cut
-d' ' -f1)
139 validate_trace
"$SYSCALL_LIST" $TRACE_PATH
140 check_trace_content
-t 3 -p $pid $TRACE_PATH 2>/dev
/null
142 destroy_lttng_session_ok
$SESSION_NAME
147 function test_big_ppoll
()
149 TRACE_PATH
=$
(mktemp
-d)
150 SESSION_NAME
="syscall_payload"
153 diag
"ppoll with 2047 FDs"
155 create_lttng_session_ok
$SESSION_NAME $TRACE_PATH
157 lttng_enable_kernel_syscall_ok
$SESSION_NAME $SYSCALL_LIST
158 add_context_kernel_ok
$SESSION_NAME channel0 pid
160 start_lttng_tracing_ok
161 { out
=$
(yes |
$CURDIR/select_poll_epoll
-t 4); } 2>/dev
/null
162 stop_lttng_tracing_ok
163 pid
=$
(echo $out | cut
-d' ' -f1)
165 validate_trace
"$SYSCALL_LIST" $TRACE_PATH
166 check_trace_content
-t 4 -p $pid $TRACE_PATH 2>/dev
/null
168 destroy_lttng_session_ok
$SESSION_NAME
173 function test_ppoll_overflow
()
175 TRACE_PATH
=$
(mktemp
-d)
176 SESSION_NAME
="syscall_payload"
179 diag
"ppoll buffer overflow, should segfault, waits for input"
181 create_lttng_session_ok
$SESSION_NAME $TRACE_PATH
183 lttng_enable_kernel_syscall_ok
$SESSION_NAME $SYSCALL_LIST
184 add_context_kernel_ok
$SESSION_NAME channel0 pid
186 start_lttng_tracing_ok
187 diag
"Expect segfaults"
188 { out
=$
(yes |
$CURDIR/select_poll_epoll
-t 5); } 2>/dev
/null
189 stop_lttng_tracing_ok
191 pid
=$
(echo $out | cut
-d' ' -f1)
193 validate_trace
"$SYSCALL_LIST" $TRACE_PATH
195 check_trace_content
-t 5 -p $pid $TRACE_PATH 2>/dev
/null
197 destroy_lttng_session_ok
$SESSION_NAME
202 function test_pselect_invalid_ptr
()
204 TRACE_PATH
=$
(mktemp
-d)
205 SESSION_NAME
="syscall_payload"
206 SYSCALL_LIST
="pselect6"
208 diag
"pselect with invalid pointer, waits for input"
210 create_lttng_session_ok
$SESSION_NAME $TRACE_PATH
212 lttng_enable_kernel_syscall_ok
$SESSION_NAME $SYSCALL_LIST
213 add_context_kernel_ok
$SESSION_NAME channel0 pid
215 start_lttng_tracing_ok
216 { out
=$
(yes |
$CURDIR/select_poll_epoll
-t 6); } 2>/dev
/null
217 stop_lttng_tracing_ok
218 pid
=$
(echo $out | cut
-d' ' -f1)
220 validate_trace
"$SYSCALL_LIST" $TRACE_PATH
221 check_trace_content
-t 6 -p $pid $TRACE_PATH 2>/dev
/null
223 destroy_lttng_session_ok
$SESSION_NAME
228 function test_ppoll_ulong_max
()
230 TRACE_PATH
=$
(mktemp
-d)
231 SESSION_NAME
="syscall_payload"
234 diag
"ppoll with ulong_max fds, waits for input"
236 create_lttng_session_ok
$SESSION_NAME $TRACE_PATH
238 lttng_enable_kernel_syscall_ok
$SESSION_NAME $SYSCALL_LIST
239 add_context_kernel_ok
$SESSION_NAME channel0 pid
241 start_lttng_tracing_ok
242 { out
=$
(yes |
$CURDIR/select_poll_epoll
-t 7); } 2>/dev
/null
243 stop_lttng_tracing_ok
244 pid
=$
(echo $out | cut
-d' ' -f1)
246 validate_trace
"$SYSCALL_LIST" $TRACE_PATH
247 check_trace_content
-t 7 -p $pid $TRACE_PATH 2>/dev
/null
249 destroy_lttng_session_ok
$SESSION_NAME
254 function test_epoll_pwait_invalid_ptr
()
256 TRACE_PATH
=$
(mktemp
-d)
257 SESSION_NAME
="syscall_payload"
258 SYSCALL_LIST
="epoll_pwait"
260 diag
"epoll_pwait with invalid pointer, waits for input"
262 create_lttng_session_ok
$SESSION_NAME $TRACE_PATH
264 lttng_enable_kernel_syscall_ok
$SESSION_NAME $SYSCALL_LIST
265 add_context_kernel_ok
$SESSION_NAME channel0 pid
267 start_lttng_tracing_ok
268 { out
=$
(yes |
$CURDIR/select_poll_epoll
-t 8); } 2>/dev
/null
269 stop_lttng_tracing_ok
270 pid
=$
(echo $out | cut
-d' ' -f1)
272 validate_trace
"$SYSCALL_LIST" $TRACE_PATH
273 check_trace_content
-t 8 -p $pid $TRACE_PATH 2>/dev
/null
275 destroy_lttng_session_ok
$SESSION_NAME
280 function test_epoll_pwait_int_max
()
282 TRACE_PATH
=$
(mktemp
-d)
283 SESSION_NAME
="syscall_payload"
284 SYSCALL_LIST
="epoll_pwait"
286 diag
"epoll_pwait with maxevents set to INT_MAX, waits for input"
288 create_lttng_session_ok
$SESSION_NAME $TRACE_PATH
290 lttng_enable_kernel_syscall_ok
$SESSION_NAME $SYSCALL_LIST
291 add_context_kernel_ok
$SESSION_NAME channel0 pid
293 start_lttng_tracing_ok
294 { out
=$
(yes |
$CURDIR/select_poll_epoll
-t 9); } 2>/dev
/null
295 stop_lttng_tracing_ok
296 pid
=$
(echo $out | cut
-d' ' -f1)
298 validate_trace
"$SYSCALL_LIST" $TRACE_PATH
299 check_trace_content
-t 9 -p $pid $TRACE_PATH 2>/dev
/null
301 destroy_lttng_session_ok
$SESSION_NAME
306 function test_ppoll_concurrent
()
308 TRACE_PATH
=$
(mktemp
-d)
309 SESSION_NAME
="syscall_payload"
312 diag
"ppoll with concurrent updates of the structure from user-space, stress test (3000 iterations), waits for input + timeout 1ms"
314 create_lttng_session_ok
$SESSION_NAME $TRACE_PATH
316 lttng_enable_kernel_syscall_ok
$SESSION_NAME $SYSCALL_LIST
317 add_context_kernel_ok
$SESSION_NAME channel0 pid
319 start_lttng_tracing_ok
320 { out
=$
(yes |
$CURDIR/select_poll_epoll
-t 10); } 2>/dev
/null
321 stop_lttng_tracing_ok
322 pid
=$
(echo $out | cut
-d' ' -f1)
324 validate_trace
"$SYSCALL_LIST" $TRACE_PATH
325 check_trace_content
-t 10 -p $pid $TRACE_PATH 2>/dev
/null
327 destroy_lttng_session_ok
$SESSION_NAME
332 function test_epoll_pwait_concurrent
()
334 TRACE_PATH
=$
(mktemp
-d)
335 SESSION_NAME
="syscall_payload"
336 SYSCALL_LIST
="epoll_ctl,epoll_pwait"
338 diag
"epoll_pwait with concurrent munmap of the buffer from user-space, should randomly segfault, run multiple times, waits for input + timeout 1ms"
340 create_lttng_session_ok
$SESSION_NAME $TRACE_PATH
342 lttng_enable_kernel_syscall_ok
$SESSION_NAME $SYSCALL_LIST
343 add_context_kernel_ok
$SESSION_NAME channel0 pid
345 start_lttng_tracing_ok
346 diag
"Expect segfaults"
347 for i
in $
(seq 1 100); do
348 { out
=$
($CURDIR/select_poll_epoll
-t 11); } 2>/dev
/null
350 pid
=$
(echo $out | cut
-d' ' -f1)
351 stop_lttng_tracing_ok
353 # epoll_wait is not always generated in the trace (stress test)
354 validate_trace
"epoll_ctl" $TRACE_PATH
355 check_trace_content
-t 11 -p $pid $TRACE_PATH 2>/dev
/null
357 destroy_lttng_session_ok
$SESSION_NAME
362 # MUST set TESTDIR before calling those functions
363 plan_tests
$NUM_TESTS
365 print_test_banner
"$TEST_DESC"
367 if [ "$(id -u)" == "0" ]; then
373 skip
$isroot "Root access is needed. Skipping all tests." $NUM_TESTS ||
375 validate_lttng_modules_present
381 test_pselect_invalid_fd
384 test_pselect_invalid_ptr
386 test_epoll_pwait_invalid_ptr
387 test_epoll_pwait_int_max
388 test_ppoll_concurrent
389 test_epoll_pwait_concurrent
393 NEW_WARNING
=$
(dmesg |
grep " WARNING:" | cut
-d' ' -f1 |
tail -1)
394 NEW_OOPS
=$
(dmesg |
grep " OOPS:" | cut
-d' ' -f1 |
tail -1)
395 NEW_BUG
=$
(dmesg |
grep " BUG:" | cut
-d' ' -f1 |
tail -1)
397 if test "$LAST_WARNING" != "$NEW_WARNING"; then
398 fail
"New WARNING generated"
400 if test "$LAST_OOPS" != "$NEW_OOPS"; then
401 fail
"New OOPS generated"
403 if test "$LAST_BUG" != "$NEW_BUG"; then
404 fail
"New BUG generated"