1#!/bin/sh
2# SPDX-License-Identifier: GPL-2.0
3# description: event tracing - restricts events based on pid notrace filtering
4# requires: set_event events/sched set_event_pid set_event_notrace_pid
5# flags: instance
6
7do_reset() {
8    echo > set_event
9    echo > set_event_pid
10    echo > set_event_notrace_pid
11    echo 0 > options/event-fork
12    echo 0 > events/enable
13    clear_trace
14    echo 1 > tracing_on
15}
16
17fail() { #msg
18    cat trace
19    do_reset
20    echo $1
21    exit_fail
22}
23
24count_pid() {
25    pid=$@
26    cat trace | grep -v '^#' | sed -e 's/[^-]*-\([0-9]*\).*/\1/' | grep $pid | wc -l
27}
28
29count_no_pid() {
30    pid=$1
31    cat trace | grep -v '^#' | sed -e 's/[^-]*-\([0-9]*\).*/\1/' | grep -v $pid | wc -l
32}
33
34enable_system() {
35    system=$1
36
37    if [ -d events/$system ]; then
38	echo 1 > events/$system/enable
39    fi
40}
41
42enable_events() {
43    echo 0 > tracing_on
44    # Enable common groups of events, as all events can allow for
45    # events to be traced via scheduling that we don't care to test.
46    enable_system syscalls
47    enable_system rcu
48    enable_system block
49    enable_system exceptions
50    enable_system irq
51    enable_system net
52    enable_system power
53    enable_system signal
54    enable_system sock
55    enable_system timer
56    enable_system thermal
57    echo 1 > tracing_on
58}
59
60echo 0 > options/event-fork
61
62do_reset
63
64read mypid rest < /proc/self/stat
65
66echo $mypid > set_event_notrace_pid
67grep -q $mypid set_event_notrace_pid
68
69enable_events
70
71yield
72
73echo 0 > tracing_on
74
75cnt=`count_pid $mypid`
76if [ $cnt -ne 0 ]; then
77    fail "Filtered out task has events"
78fi
79
80cnt=`count_no_pid $mypid`
81if [ $cnt -eq 0 ]; then
82    fail "No other events were recorded"
83fi
84
85do_reset
86
87echo $mypid > set_event_notrace_pid
88echo 1 > options/event-fork
89
90enable_events
91
92yield &
93child=$!
94echo "child = $child"
95wait $child
96
97echo 0 > tracing_on
98
99cnt=`count_pid $mypid`
100if [ $cnt -ne 0 ]; then
101    fail "Filtered out task has events"
102fi
103
104cnt=`count_pid $child`
105if [ $cnt -ne 0 ]; then
106    fail "Child of filtered out taskhas events"
107fi
108
109cnt=`count_no_pid $mypid`
110if [ $cnt -eq 0 ]; then
111    fail "No other events were recorded"
112fi
113
114do_reset
115
116exit 0
117