xref: /linux/tools/verification/rv/tests/rv_mon.t (revision 55ee4b931a7ffedc886175d265dd6e6d08fd4151)
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