| #!/bin/bash |
| # SPDX-License-Identifier: GPL-2.0 |
| source ../tests/engine.sh |
| test_begin |
| |
| set_timeout 30s |
| |
| RVDIR=/sys/kernel/tracing/rv/ |
| |
| # Help and basic tests |
| check "verify mon subcommand help" \ |
| "$RV mon --help" 0 "run a monitor" |
| |
| # Error handling tests |
| check "mon without monitor name" \ |
| "$RV mon" 1 "usage: rv mon" |
| |
| check "invalid monitor name" \ |
| "$RV mon invalid" 1 "monitor invalid does not exist" |
| |
| if [ -d $RVDIR/monitors/wwnr ]; then |
| |
| check "invalid reactor name" \ |
| "$RV mon wwnr -r invalid" 1 "failed to set invalid reactor, is it available?" |
| |
| check "monitor name is substring of another monitor" \ |
| "$RV mon nr" 1 "monitor nr does not exist" |
| |
| check "already enabled monitor returns error" \ |
| "echo 1 > $RVDIR/monitors/wwnr/enable; $RV mon wwnr" 1 \ |
| "monitor wwnr (in-kernel) is already enabled" |
| echo 0 > $RVDIR/monitors/wwnr/enable |
| |
| fi |
| |
| # rv mon runs until terminated |
| set_expected_timeout 2s |
| |
| # Run monitors with different configurations |
| check_if_exists "run the monitor without parameters" \ |
| "$RV mon wwnr" "$RVDIR/monitors/wwnr" "" "." |
| |
| check_if_exists "run the monitor as verbose" \ |
| "$RV mon wwnr -v" "$RVDIR/monitors/wwnr" \ |
| "my pid is \$pid" "\(event\|error\)" |
| |
| check_if_exists "run the monitor with a reactor" \ |
| "$RV mon wwnr -r printk & sleep .5 && cat $RVDIR/monitors/wwnr/reactors && wait" \ |
| "$RVDIR/monitors/wwnr/reactors" "\[printk\]" |
| |
| check_if_exists "reactor is restored after exit" \ |
| "cat $RVDIR/monitors/wwnr/reactors" \ |
| "$RVDIR/monitors/wwnr/reactors" "\[nop\]" |
| |
| check_if_exists "run a nested monitor with a reactor" \ |
| "$RV mon snroc -r printk & sleep .5 && cat $RVDIR/monitors/sched/snroc/reactors && wait" \ |
| "$RVDIR/monitors/sched/snroc/reactors" "\[printk\]" |
| |
| check_if_exists "run an explicitly nested monitor with a reactor" \ |
| "$RV mon sched:sssw -r printk & sleep .5 && cat $RVDIR/monitors/sched/sssw/reactors && wait" \ |
| "$RVDIR/monitors/sched/sssw/reactors" "\[printk\]" |
| |
| check_if_exists "run container monitor" \ |
| "$RV mon sched & sleep .5 && cat $RVDIR/monitors/sched/{sssw,sco}/enable && wait" \ |
| "$RVDIR/monitors/sched" "1" "0" "^1$" |
| |
| # Regexes for the trace |
| header="^[[:space:]]\+\(\([][A-Z_x<>-]\+\||\)[[:space:]]*\)\+$" |
| type="\(event\|error\)[[:space:]]\+" |
| genpid="[0-9]\+[[:space:]]\+" |
| selfpid="\$pid[[:space:]]\+" |
| cpu="\[[0-9]\{3\}\][[:space:]]\+" |
| state="[a-z_]\+ " |
| trace_task="${genpid}${cpu}${type}${genpid}${state}" |
| trace_task_self="${genpid}${cpu}${type}${selfpid}${state}" |
| trace_cpu="${genpid}${cpu}${type}${state}" |
| trace_cpu_self="${selfpid}${cpu}${type}${state}" |
| |
| check_if_exists "run per-task monitor with tracing" \ |
| "$RV mon sssw -t" "$RVDIR/monitors/sched/sssw" \ |
| "$header" "$trace_task_self" "\($header\|$trace_task\)" |
| |
| check_if_exists "run per-task monitor tracing also self" \ |
| "$RV mon sched:sssw -t -s" "$RVDIR/monitors/sched/sssw" \ |
| "$trace_task_self" "" "\($header\|$trace_task\)" |
| |
| check_if_exists "run per-cpu monitor with tracing" \ |
| "$RV mon sched:sco -t" "$RVDIR/monitors/sched/sco" \ |
| "$header" "$trace_cpu_self" "\($header\|$trace_cpu\)" |
| |
| check_if_exists "run per-cpu monitor tracing also self" \ |
| "$RV mon sco -t -s" "$RVDIR/monitors/sched/sco" \ |
| "$trace_cpu_self" "" "\($header\|$trace_cpu\)" |
| |
| test_end |