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