1*92f0ce55SGabriele Monaco#!/bin/bash 2*92f0ce55SGabriele Monaco# SPDX-License-Identifier: GPL-2.0 3*92f0ce55SGabriele Monacosource ../tests/engine.sh 4*92f0ce55SGabriele Monacotest_begin 5*92f0ce55SGabriele Monaco 6*92f0ce55SGabriele Monacoset_timeout 30s 7*92f0ce55SGabriele Monaco 8*92f0ce55SGabriele MonacoRVDIR=/sys/kernel/tracing/rv/ 9*92f0ce55SGabriele Monaco 10*92f0ce55SGabriele Monaco# Help and basic tests 11*92f0ce55SGabriele Monacocheck "verify mon subcommand help" \ 12*92f0ce55SGabriele Monaco "$RV mon --help" 0 "run a monitor" 13*92f0ce55SGabriele Monaco 14*92f0ce55SGabriele Monaco# Error handling tests 15*92f0ce55SGabriele Monacocheck "mon without monitor name" \ 16*92f0ce55SGabriele Monaco "$RV mon" 1 "usage: rv mon" 17*92f0ce55SGabriele Monaco 18*92f0ce55SGabriele Monacocheck "invalid monitor name" \ 19*92f0ce55SGabriele Monaco "$RV mon invalid" 1 "monitor invalid does not exist" 20*92f0ce55SGabriele Monaco 21*92f0ce55SGabriele Monacoif [ -d $RVDIR/monitors/wwnr ]; then 22*92f0ce55SGabriele Monaco 23*92f0ce55SGabriele Monacocheck "invalid reactor name" \ 24*92f0ce55SGabriele Monaco "$RV mon wwnr -r invalid" 1 "failed to set invalid reactor, is it available?" 25*92f0ce55SGabriele Monaco 26*92f0ce55SGabriele Monacocheck "monitor name is substring of another monitor" \ 27*92f0ce55SGabriele Monaco "$RV mon nr" 1 "monitor nr does not exist" 28*92f0ce55SGabriele Monaco 29*92f0ce55SGabriele Monacocheck "already enabled monitor returns error" \ 30*92f0ce55SGabriele Monaco "echo 1 > $RVDIR/monitors/wwnr/enable; $RV mon wwnr" 1 \ 31*92f0ce55SGabriele Monaco "monitor wwnr (in-kernel) is already enabled" 32*92f0ce55SGabriele Monacoecho 0 > $RVDIR/monitors/wwnr/enable 33*92f0ce55SGabriele Monaco 34*92f0ce55SGabriele Monacofi 35*92f0ce55SGabriele Monaco 36*92f0ce55SGabriele Monaco# rv mon runs until terminated 37*92f0ce55SGabriele Monacoset_expected_timeout 2s 38*92f0ce55SGabriele Monaco 39*92f0ce55SGabriele Monaco# Run monitors with different configurations 40*92f0ce55SGabriele Monacocheck_if_exists "run the monitor without parameters" \ 41*92f0ce55SGabriele Monaco "$RV mon wwnr" "$RVDIR/monitors/wwnr" "" "." 42*92f0ce55SGabriele Monaco 43*92f0ce55SGabriele Monacocheck_if_exists "run the monitor as verbose" \ 44*92f0ce55SGabriele Monaco "$RV mon wwnr -v" "$RVDIR/monitors/wwnr" \ 45*92f0ce55SGabriele Monaco "my pid is \$pid" "\(event\|error\)" 46*92f0ce55SGabriele Monaco 47*92f0ce55SGabriele Monacocheck_if_exists "run the monitor with a reactor" \ 48*92f0ce55SGabriele Monaco "$RV mon wwnr -r printk & sleep .5 && cat $RVDIR/monitors/wwnr/reactors && wait" \ 49*92f0ce55SGabriele Monaco "$RVDIR/monitors/wwnr/reactors" "\[printk\]" 50*92f0ce55SGabriele Monaco 51*92f0ce55SGabriele Monacocheck_if_exists "reactor is restored after exit" \ 52*92f0ce55SGabriele Monaco "cat $RVDIR/monitors/wwnr/reactors" \ 53*92f0ce55SGabriele Monaco "$RVDIR/monitors/wwnr/reactors" "\[nop\]" 54*92f0ce55SGabriele Monaco 55*92f0ce55SGabriele Monacocheck_if_exists "run a nested monitor with a reactor" \ 56*92f0ce55SGabriele Monaco "$RV mon snroc -r printk & sleep .5 && cat $RVDIR/monitors/sched/snroc/reactors && wait" \ 57*92f0ce55SGabriele Monaco "$RVDIR/monitors/sched/snroc/reactors" "\[printk\]" 58*92f0ce55SGabriele Monaco 59*92f0ce55SGabriele Monacocheck_if_exists "run an explicitly nested monitor with a reactor" \ 60*92f0ce55SGabriele Monaco "$RV mon sched:sssw -r printk & sleep .5 && cat $RVDIR/monitors/sched/sssw/reactors && wait" \ 61*92f0ce55SGabriele Monaco "$RVDIR/monitors/sched/sssw/reactors" "\[printk\]" 62*92f0ce55SGabriele Monaco 63*92f0ce55SGabriele Monacocheck_if_exists "run container monitor" \ 64*92f0ce55SGabriele Monaco "$RV mon sched & sleep .5 && cat $RVDIR/monitors/sched/{sssw,sco}/enable && wait" \ 65*92f0ce55SGabriele Monaco "$RVDIR/monitors/sched" "1" "0" "^1$" 66*92f0ce55SGabriele Monaco 67*92f0ce55SGabriele Monaco# Regexes for the trace 68*92f0ce55SGabriele Monacoheader="^[[:space:]]\+\(\([][A-Z_x<>-]\+\||\)[[:space:]]*\)\+$" 69*92f0ce55SGabriele Monacotype="\(event\|error\)[[:space:]]\+" 70*92f0ce55SGabriele Monacogenpid="[0-9]\+[[:space:]]\+" 71*92f0ce55SGabriele Monacoselfpid="\$pid[[:space:]]\+" 72*92f0ce55SGabriele Monacocpu="\[[0-9]\{3\}\][[:space:]]\+" 73*92f0ce55SGabriele Monacostate="[a-z_]\+ " 74*92f0ce55SGabriele Monacotrace_task="${genpid}${cpu}${type}${genpid}${state}" 75*92f0ce55SGabriele Monacotrace_task_self="${genpid}${cpu}${type}${selfpid}${state}" 76*92f0ce55SGabriele Monacotrace_cpu="${genpid}${cpu}${type}${state}" 77*92f0ce55SGabriele Monacotrace_cpu_self="${selfpid}${cpu}${type}${state}" 78*92f0ce55SGabriele Monaco 79*92f0ce55SGabriele Monacocheck_if_exists "run per-task monitor with tracing" \ 80*92f0ce55SGabriele Monaco "$RV mon sssw -t" "$RVDIR/monitors/sched/sssw" \ 81*92f0ce55SGabriele Monaco "$header" "$trace_task_self" "\($header\|$trace_task\)" 82*92f0ce55SGabriele Monaco 83*92f0ce55SGabriele Monacocheck_if_exists "run per-task monitor tracing also self" \ 84*92f0ce55SGabriele Monaco "$RV mon sched:sssw -t -s" "$RVDIR/monitors/sched/sssw" \ 85*92f0ce55SGabriele Monaco "$trace_task_self" "" "\($header\|$trace_task\)" 86*92f0ce55SGabriele Monaco 87*92f0ce55SGabriele Monacocheck_if_exists "run per-cpu monitor with tracing" \ 88*92f0ce55SGabriele Monaco "$RV mon sched:sco -t" "$RVDIR/monitors/sched/sco" \ 89*92f0ce55SGabriele Monaco "$header" "$trace_cpu_self" "\($header\|$trace_cpu\)" 90*92f0ce55SGabriele Monaco 91*92f0ce55SGabriele Monacocheck_if_exists "run per-cpu monitor tracing also self" \ 92*92f0ce55SGabriele Monaco "$RV mon sco -t -s" "$RVDIR/monitors/sched/sco" \ 93*92f0ce55SGabriele Monaco "$trace_cpu_self" "" "\($header\|$trace_cpu\)" 94*92f0ce55SGabriele Monaco 95*92f0ce55SGabriele Monacotest_end 96