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