^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) #!/bin/sh
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) # SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) usage() {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) echo "Ftrace boottime trace test tool"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) echo "Usage: $0 [--apply|--init] [--debug] BOOTCONFIG-FILE"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) echo " --apply: Test actual apply to tracefs (need sudo)"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) echo " --init: Initialize ftrace before applying (imply --apply)"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) exit 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) [ $# -eq 0 ] && usage
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) BCONF=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) DEBUG=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) APPLY=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) INIT=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) while [ x"$1" != x ]; do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) case "$1" in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) "--debug")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) DEBUG=$1;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) "--apply")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) APPLY=$1;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) "--init")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) APPLY=$1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) INIT=$1;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) *)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) [ ! -f $1 ] && usage
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) BCONF=$1;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) esac
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) shift 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) done
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) if [ x"$APPLY" != x ]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) if [ `id -u` -ne 0 ]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) echo "This must be run by root user. Try sudo." 1>&2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) exec sudo $0 $DEBUG $APPLY $BCONF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) run_cmd() { # command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) echo "$*"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) if [ x"$APPLY" != x ]; then # apply command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) eval $*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) if [ x"$DEBUG" != x ]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) set -x
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) TRACEFS=`grep -m 1 -w tracefs /proc/mounts | cut -f 2 -d " "`
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) if [ -z "$TRACEFS" ]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) if ! grep -wq debugfs /proc/mounts; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) echo "Error: No tracefs/debugfs was mounted." 1>&2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) exit 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) TRACEFS=`grep -m 1 -w debugfs /proc/mounts | cut -f 2 -d " "`/tracing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) if [ ! -d $TRACEFS ]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) echo "Error: ftrace is not enabled on this kernel." 1>&2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) exit 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) if [ x"$INIT" != x ]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) . `dirname $0`/ftrace.sh
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) (cd $TRACEFS; initialize_ftrace)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) . `dirname $0`/xbc.sh
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) ######## main #########
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) set -e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) xbc_init $BCONF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) set_value_of() { # key file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) if xbc_has_key $1; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) val=`xbc_get_val $1 1`
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) run_cmd "echo '$val' >> $2"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) set_array_of() { # key file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) if xbc_has_key $1; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) xbc_get_val $1 | while read line; do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) run_cmd "echo '$line' >> $2"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) done
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) compose_synth() { # event_name branch
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) echo -n "$1 "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) xbc_get_val $2 | while read field; do echo -n "$field; "; done
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) setup_event() { # prefix group event [instance]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) branch=$1.$2.$3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) if [ "$4" ]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) eventdir="$TRACEFS/instances/$4/events/$2/$3"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) eventdir="$TRACEFS/events/$2/$3"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) case $2 in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) kprobes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) xbc_get_val ${branch}.probes | while read line; do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) run_cmd "echo 'p:kprobes/$3 $line' >> $TRACEFS/kprobe_events"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) done
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) synthetic)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) run_cmd "echo '`compose_synth $3 ${branch}.fields`' >> $TRACEFS/synthetic_events"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) esac
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) set_value_of ${branch}.filter ${eventdir}/filter
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) set_array_of ${branch}.actions ${eventdir}/trigger
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) if xbc_has_key ${branch}.enable; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) run_cmd "echo 1 > ${eventdir}/enable"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) setup_events() { # prefix("ftrace" or "ftrace.instance.INSTANCE") [instance]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) prefix="${1}.event"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) if xbc_has_branch ${1}.event; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) for grpev in `xbc_subkeys ${1}.event 2`; do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) setup_event $prefix ${grpev%.*} ${grpev#*.} $2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) done
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) size2kb() { # size[KB|MB]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) case $1 in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) *KB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) echo ${1%KB};;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) *MB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) expr ${1%MB} \* 1024;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) *)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) expr $1 / 1024 ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) esac
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) setup_instance() { # [instance]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) if [ "$1" ]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) instance="ftrace.instance.${1}"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) instancedir=$TRACEFS/instances/$1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) instance="ftrace"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) instancedir=$TRACEFS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) set_array_of ${instance}.options ${instancedir}/trace_options
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) set_value_of ${instance}.trace_clock ${instancedir}/trace_clock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) set_value_of ${instance}.cpumask ${instancedir}/tracing_cpumask
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) set_value_of ${instance}.tracing_on ${instancedir}/tracing_on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) set_value_of ${instance}.tracer ${instancedir}/current_tracer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) set_array_of ${instance}.ftrace.filters \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) ${instancedir}/set_ftrace_filter
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) set_array_of ${instance}.ftrace.notrace \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) ${instancedir}/set_ftrace_notrace
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) if xbc_has_key ${instance}.alloc_snapshot; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) run_cmd "echo 1 > ${instancedir}/snapshot"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) if xbc_has_key ${instance}.buffer_size; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) size=`xbc_get_val ${instance}.buffer_size 1`
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) size=`eval size2kb $size`
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) run_cmd "echo $size >> ${instancedir}/buffer_size_kb"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) setup_events ${instance} $1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) set_array_of ${instance}.events ${instancedir}/set_event
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) # ftrace global configs (kernel.*)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) if xbc_has_key "kernel.dump_on_oops"; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) dump_mode=`xbc_get_val "kernel.dump_on_oops" 1`
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) [ "$dump_mode" ] && dump_mode=`eval echo $dump_mode` || dump_mode=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) run_cmd "echo \"$dump_mode\" > /proc/sys/kernel/ftrace_dump_on_oops"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) set_value_of kernel.fgraph_max_depth $TRACEFS/max_graph_depth
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) set_array_of kernel.fgraph_filters $TRACEFS/set_graph_function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) set_array_of kernel.fgraph_notraces $TRACEFS/set_graph_notrace
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) # Per-instance/per-event configs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) if ! xbc_has_branch "ftrace" ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) exit 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) setup_instance # root instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) if xbc_has_branch "ftrace.instance"; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) for i in `xbc_subkeys "ftrace.instance" 1`; do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) run_cmd "mkdir -p $TRACEFS/instances/$i"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) setup_instance $i
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) done
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200)