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