Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

+251
+1
MAINTAINERS
··· 22498 22498 F: include/linux/rv.h 22499 22499 F: include/rv/ 22500 22500 F: kernel/trace/rv/ 22501 + F: tools/testing/selftests/verification/ 22501 22502 F: tools/verification/ 22502 22503 22503 22504 RUST
+2
tools/testing/selftests/verification/.gitignore
··· 1 + # SPDX-License-Identifier: GPL-2.0-only 2 + logs
+8
tools/testing/selftests/verification/Makefile
··· 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
+1
tools/testing/selftests/verification/config
··· 1 + CONFIG_RV=y
+1
tools/testing/selftests/verification/settings
··· 1 + timeout=0
+39
tools/testing/selftests/verification/test.d/functions
··· 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 + }
+75
tools/testing/selftests/verification/test.d/rv_monitor_enable_disable.tc
··· 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
+68
tools/testing/selftests/verification/test.d/rv_monitor_reactor.tc
··· 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"
+18
tools/testing/selftests/verification/test.d/rv_monitors_available.tc
··· 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
+30
tools/testing/selftests/verification/test.d/rv_wwnr_printk.tc
··· 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
+8
tools/testing/selftests/verification/verificationtest-ktap
··· 1 + #!/bin/sh -e 2 + # SPDX-License-Identifier: GPL-2.0-only 3 + # 4 + # ftracetest-ktap: Wrapper to integrate ftracetest with the kselftest runner 5 + # 6 + # Copyright (C) Arm Ltd., 2023 7 + 8 + ../ftrace/ftracetest -K -v --rv ../verification