Skip to content

Commit 0c0cd93

Browse files
committed
selftests/verification: Add initial RV tests
Add a series of tests to validate the RV tracefs API and basic functionality. * available monitors: Check that all monitors (from the monitors folder) appear as available and have a description. Works with nested monitors. * enable/disable: Enable and disable all monitors and validate both the enabled file and the enabled_monitors. Check that enabling container monitors enables all nested monitors. * reactors: Set all reactors and validate the setting, also for nested monitors. * wwnr with printk: wwnr is broken on purpose, run it with a load and check that the printk reactor works. Also validate disabling reacting_on or monitoring_on prevents reactions. These tests use the ftracetest suite. Acked-by: Nam Cao <namcao@linutronix.de> Link: https://lore.kernel.org/r/20251017115203.140080-3-gmonaco@redhat.com Signed-off-by: Gabriele Monaco <gmonaco@redhat.com>
1 parent a0aa283 commit 0c0cd93

11 files changed

Lines changed: 251 additions & 0 deletions

File tree

MAINTAINERS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22498,6 +22498,7 @@ F: Documentation/trace/rv/
2249822498
F: include/linux/rv.h
2249922499
F: include/rv/
2250022500
F: kernel/trace/rv/
22501+
F: tools/testing/selftests/verification/
2250122502
F: tools/verification/
2250222503

2250322504
RUST
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# SPDX-License-Identifier: GPL-2.0-only
2+
logs
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# SPDX-License-Identifier: GPL-2.0
2+
all:
3+
4+
TEST_PROGS := verificationtest-ktap
5+
TEST_FILES := test.d settings
6+
EXTRA_CLEAN := $(OUTPUT)/logs/*
7+
8+
include ../lib.mk
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
CONFIG_RV=y
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
timeout=0
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
check_requires() { # Check required files, monitors and reactors
2+
for i in "$@" ; do
3+
p=${i%:program}
4+
m=${i%:monitor}
5+
r=${i%:reactor}
6+
if [ $p != $i ]; then
7+
if ! which $p ; then
8+
echo "Required program $p is not found."
9+
exit_unresolved
10+
fi
11+
elif [ $m != $i ]; then
12+
if ! grep -wq $m available_monitors ; then
13+
echo "Required monitor $m is not configured."
14+
exit_unsupported
15+
fi
16+
elif [ $r != $i ]; then
17+
if ! grep -wq $r available_reactors ; then
18+
echo "Required reactor $r is not configured."
19+
exit_unsupported
20+
fi
21+
elif [ ! -e $i ]; then
22+
echo "Required feature interface $i doesn't exist."
23+
exit_unsupported
24+
fi
25+
done
26+
}
27+
28+
initialize_system() { # Reset RV to initial-state
29+
echo > enabled_monitors
30+
for m in monitors/*; do
31+
echo nop > $m/reactors || true
32+
done
33+
echo 1 > monitoring_on
34+
echo 1 > reacting_on || true
35+
}
36+
37+
finish_system() {
38+
initialize_system
39+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
#!/bin/sh
2+
# SPDX-License-Identifier: GPL-2.0-or-later
3+
# description: Test monitor enable/disable
4+
5+
test_simple_monitor() {
6+
local monitor="$1"
7+
local prefix="$2" # nested monitors
8+
9+
echo 1 > "monitors/$prefix$monitor/enable"
10+
grep -q "$monitor$" enabled_monitors
11+
12+
echo 0 > "monitors/$prefix$monitor/enable"
13+
! grep -q "$monitor$" enabled_monitors
14+
15+
echo "$monitor" >> enabled_monitors
16+
grep -q 1 "monitors/$prefix$monitor/enable"
17+
18+
echo "!$monitor" >> enabled_monitors
19+
grep -q 0 "monitors/$prefix$monitor/enable"
20+
}
21+
22+
test_container_monitor() {
23+
local monitor="$1"
24+
local nested
25+
26+
echo 1 > "monitors/$monitor/enable"
27+
grep -q "^$monitor$" enabled_monitors
28+
29+
for nested_dir in "monitors/$monitor"/*; do
30+
[ -d "$nested_dir" ] || continue
31+
nested=$(basename "$nested_dir")
32+
grep -q "^$monitor:$nested$" enabled_monitors
33+
done
34+
test -n "$nested"
35+
36+
echo 0 > "monitors/$monitor/enable"
37+
! grep -q "^$monitor$" enabled_monitors
38+
39+
for nested_dir in "monitors/$monitor"/*; do
40+
[ -d "$nested_dir" ] || continue
41+
nested=$(basename "$nested_dir")
42+
! grep -q "^$monitor:$nested$" enabled_monitors
43+
done
44+
45+
echo "$monitor" >> enabled_monitors
46+
grep -q 1 "monitors/$monitor/enable"
47+
48+
for nested_dir in "monitors/$monitor"/*; do
49+
[ -d "$nested_dir" ] || continue
50+
nested=$(basename "$nested_dir")
51+
grep -q "^$monitor:$nested$" enabled_monitors
52+
done
53+
54+
echo "!$monitor" >> enabled_monitors
55+
grep -q 0 "monitors/$monitor/enable"
56+
57+
for nested_dir in "monitors/$monitor"/*; do
58+
[ -d "$nested_dir" ] || continue
59+
nested=$(basename "$nested_dir")
60+
test_simple_monitor "$nested" "$monitor/"
61+
done
62+
}
63+
64+
for monitor_dir in monitors/*; do
65+
monitor=$(basename "$monitor_dir")
66+
67+
if find "$monitor_dir" -mindepth 1 -type d | grep -q .; then
68+
test_container_monitor "$monitor"
69+
else
70+
test_simple_monitor "$monitor"
71+
fi
72+
done
73+
74+
! echo non_existent_monitor > enabled_monitors
75+
! grep -q "^non_existent_monitor$" enabled_monitors
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
#!/bin/sh
2+
# SPDX-License-Identifier: GPL-2.0-or-later
3+
# description: Test monitor reactor setting
4+
# requires: available_reactors
5+
6+
test_monitor_reactor() {
7+
local monitor="$1"
8+
local prefix="$2" # nested monitors
9+
10+
while read -r reactor; do
11+
[ "$reactor" = nop ] && continue
12+
13+
echo "$reactor" > "monitors/$prefix$monitor/reactors"
14+
grep -q "\\[$reactor\\]" "monitors/$prefix$monitor/reactors"
15+
done < available_reactors
16+
17+
echo nop > "monitors/$prefix$monitor/reactors"
18+
grep -q "\\[nop\\]" "monitors/$prefix$monitor/reactors"
19+
}
20+
21+
test_container_monitor() {
22+
local monitor="$1"
23+
local nested
24+
25+
while read -r reactor; do
26+
[ "$reactor" = nop ] && continue
27+
28+
echo "$reactor" > "monitors/$monitor/reactors"
29+
grep -q "\\[$reactor\\]" "monitors/$monitor/reactors"
30+
31+
for nested_dir in "monitors/$monitor"/*; do
32+
[ -d "$nested_dir" ] || continue
33+
nested=$(basename "$nested_dir")
34+
grep -q "\\[$reactor\\]" "monitors/$monitor/$nested/reactors"
35+
done
36+
done < available_reactors
37+
test -n "$nested"
38+
39+
echo nop > "monitors/$monitor/reactors"
40+
grep -q "\\[nop\\]" "monitors/$monitor/reactors"
41+
42+
for nested_dir in "monitors/$monitor"/*; do
43+
[ -d "$nested_dir" ] || continue
44+
nested=$(basename "$nested_dir")
45+
grep -q "\\[nop\\]" "monitors/$monitor/$nested/reactors"
46+
done
47+
48+
for nested_dir in "monitors/$monitor"/*; do
49+
[ -d "$nested_dir" ] || continue
50+
nested=$(basename "$nested_dir")
51+
test_monitor_reactor "$nested" "$monitor/"
52+
done
53+
}
54+
55+
for monitor_dir in monitors/*; do
56+
monitor=$(basename "$monitor_dir")
57+
58+
if find "$monitor_dir" -mindepth 1 -type d | grep -q .; then
59+
test_container_monitor "$monitor"
60+
else
61+
test_monitor_reactor "$monitor"
62+
fi
63+
done
64+
65+
monitor=$(ls /sys/kernel/tracing/rv/monitors -1 | head -n 1)
66+
test -f "monitors/$monitor/reactors"
67+
! echo non_existent_reactor > "monitors/$monitor/reactors"
68+
! grep -q "\\[non_existent_reactor\\]" "monitors/$monitor/reactors"
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#!/bin/sh
2+
# SPDX-License-Identifier: GPL-2.0-or-later
3+
# description: Check available monitors
4+
5+
for monitor_dir in monitors/*; do
6+
monitor=$(basename "$monitor_dir")
7+
8+
grep -q "^$monitor$" available_monitors
9+
grep -q . "$monitor_dir"/desc
10+
11+
for nested_dir in "$monitor_dir"/*; do
12+
[ -d "$nested_dir" ] || continue
13+
nested=$(basename "$nested_dir")
14+
15+
grep -q "^$monitor:$nested$" available_monitors
16+
grep -q . "$nested_dir"/desc
17+
done
18+
done
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#!/bin/sh
2+
# SPDX-License-Identifier: GPL-2.0-or-later
3+
# description: Test wwnr monitor with printk reactor
4+
# requires: available_reactors wwnr:monitor printk:reactor stress-ng:program
5+
6+
load() { # returns true if there was a reaction
7+
local lines_before num
8+
num=$((($(nproc) + 1) / 2))
9+
lines_before=$(dmesg | wc -l)
10+
stress-ng --cpu-sched "$num" --timer "$num" -t 5 -q
11+
dmesg | tail -n $((lines_before + 1)) | grep -q "rv: monitor wwnr does not allow event"
12+
}
13+
14+
echo 1 > monitors/wwnr/enable
15+
echo printk > monitors/wwnr/reactors
16+
17+
load
18+
19+
echo 0 > monitoring_on
20+
! load
21+
echo 1 > monitoring_on
22+
23+
load
24+
25+
echo 0 > reacting_on
26+
! load
27+
echo 1 > reacting_on
28+
29+
echo nop > monitors/wwnr/reactors
30+
echo 0 > monitors/wwnr/enable

0 commit comments

Comments
 (0)