162306a36Sopenharmony_ci#!/bin/sh
262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0
362306a36Sopenharmony_ci# description: event tracing - restricts events based on pid notrace filtering
462306a36Sopenharmony_ci# requires: set_event events/sched set_event_pid set_event_notrace_pid
562306a36Sopenharmony_ci# flags: instance
662306a36Sopenharmony_ci
762306a36Sopenharmony_cido_reset() {
862306a36Sopenharmony_ci    echo > set_event
962306a36Sopenharmony_ci    echo > set_event_pid
1062306a36Sopenharmony_ci    echo > set_event_notrace_pid
1162306a36Sopenharmony_ci    echo 0 > options/event-fork
1262306a36Sopenharmony_ci    echo 0 > events/enable
1362306a36Sopenharmony_ci    clear_trace
1462306a36Sopenharmony_ci    echo 1 > tracing_on
1562306a36Sopenharmony_ci}
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_cifail() { #msg
1862306a36Sopenharmony_ci    cat trace
1962306a36Sopenharmony_ci    do_reset
2062306a36Sopenharmony_ci    echo $1
2162306a36Sopenharmony_ci    exit_fail
2262306a36Sopenharmony_ci}
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_cicount_pid() {
2562306a36Sopenharmony_ci    pid=$@
2662306a36Sopenharmony_ci    cat trace | grep -v '^#' | sed -e 's/[^-]*-\([0-9]*\).*/\1/' | grep $pid | wc -l
2762306a36Sopenharmony_ci}
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_cicount_no_pid() {
3062306a36Sopenharmony_ci    pid=$1
3162306a36Sopenharmony_ci    cat trace | grep -v '^#' | sed -e 's/[^-]*-\([0-9]*\).*/\1/' | grep -v $pid | wc -l
3262306a36Sopenharmony_ci}
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_cienable_system() {
3562306a36Sopenharmony_ci    system=$1
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci    if [ -d events/$system ]; then
3862306a36Sopenharmony_ci	echo 1 > events/$system/enable
3962306a36Sopenharmony_ci    fi
4062306a36Sopenharmony_ci}
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_cienable_events() {
4362306a36Sopenharmony_ci    echo 0 > tracing_on
4462306a36Sopenharmony_ci    # Enable common groups of events, as all events can allow for
4562306a36Sopenharmony_ci    # events to be traced via scheduling that we don't care to test.
4662306a36Sopenharmony_ci    enable_system syscalls
4762306a36Sopenharmony_ci    enable_system rcu
4862306a36Sopenharmony_ci    enable_system block
4962306a36Sopenharmony_ci    enable_system exceptions
5062306a36Sopenharmony_ci    enable_system irq
5162306a36Sopenharmony_ci    enable_system net
5262306a36Sopenharmony_ci    enable_system power
5362306a36Sopenharmony_ci    enable_system signal
5462306a36Sopenharmony_ci    enable_system sock
5562306a36Sopenharmony_ci    enable_system timer
5662306a36Sopenharmony_ci    enable_system thermal
5762306a36Sopenharmony_ci    echo 1 > tracing_on
5862306a36Sopenharmony_ci}
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ciother_task() {
6162306a36Sopenharmony_ci    sleep .001 || usleep 1 || sleep 1
6262306a36Sopenharmony_ci}
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ciecho 0 > options/event-fork
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_cido_reset
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ciread mypid rest < /proc/self/stat
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ciecho $mypid > set_event_notrace_pid
7162306a36Sopenharmony_cigrep -q $mypid set_event_notrace_pid
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_cienable_events
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ciyield
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ciecho 0 > tracing_on
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_cicnt=`count_pid $mypid`
8062306a36Sopenharmony_ciif [ $cnt -ne 0 ]; then
8162306a36Sopenharmony_ci    fail "Filtered out task has events"
8262306a36Sopenharmony_cifi
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_cicnt=`count_no_pid $mypid`
8562306a36Sopenharmony_ciif [ $cnt -eq 0 ]; then
8662306a36Sopenharmony_ci    fail "No other events were recorded"
8762306a36Sopenharmony_cifi
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_cido_reset
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ciecho $mypid > set_event_notrace_pid
9262306a36Sopenharmony_ciecho 1 > options/event-fork
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_cienable_events
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ciyield &
9762306a36Sopenharmony_cichild=$!
9862306a36Sopenharmony_ciecho "child = $child"
9962306a36Sopenharmony_ciwait $child
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ci# Be sure some other events will happen for small systems (e.g. 1 core)
10262306a36Sopenharmony_ciother_task
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ciecho 0 > tracing_on
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_cicnt=`count_pid $mypid`
10762306a36Sopenharmony_ciif [ $cnt -ne 0 ]; then
10862306a36Sopenharmony_ci    fail "Filtered out task has events"
10962306a36Sopenharmony_cifi
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_cicnt=`count_pid $child`
11262306a36Sopenharmony_ciif [ $cnt -ne 0 ]; then
11362306a36Sopenharmony_ci    fail "Child of filtered out taskhas events"
11462306a36Sopenharmony_cifi
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_cicnt=`count_no_pid $mypid`
11762306a36Sopenharmony_ciif [ $cnt -eq 0 ]; then
11862306a36Sopenharmony_ci    fail "No other events were recorded"
11962306a36Sopenharmony_cifi
12062306a36Sopenharmony_ci
12162306a36Sopenharmony_cido_reset
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ciexit 0
124