Enable a per-cpu monitor, check that the stats file appears and is populated under load, and skip cleanly when CONFIG_RV_EDGE_STAT is off.
Signed-off-by: Tobias Schaffner <[email protected]> --- tools/testing/selftests/verification/config | 3 ++ .../verification/test.d/rv_edge_stats.tc | 37 +++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 tools/testing/selftests/verification/test.d/rv_edge_stats.tc diff --git a/tools/testing/selftests/verification/config b/tools/testing/selftests/verification/config index 43072c1c38f4..caf3a96ac8b4 100644 --- a/tools/testing/selftests/verification/config +++ b/tools/testing/selftests/verification/config @@ -1 +1,4 @@ CONFIG_RV=y +CONFIG_PREEMPT_TRACER=y +CONFIG_RV_MON_WIP=y +CONFIG_RV_EDGE_STAT=y diff --git a/tools/testing/selftests/verification/test.d/rv_edge_stats.tc b/tools/testing/selftests/verification/test.d/rv_edge_stats.tc new file mode 100644 index 000000000000..c03ed6682b80 --- /dev/null +++ b/tools/testing/selftests/verification/test.d/rv_edge_stats.tc @@ -0,0 +1,37 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0-or-later +# description: Test per-edge dwell-time statistics (stats) + +MON=wip + +check_requires "$MON:monitor" + +# The "stats" file is created on enable; if it is still missing the kernel was +# built without CONFIG_RV_EDGE_STAT, so skip. +echo 1 > "monitors/$MON/enable" +if [ ! -e "monitors/$MON/stats" ]; then + echo 0 > "monitors/$MON/enable" + echo "CONFIG_RV_EDGE_STAT is not enabled." + exit_unsupported +fi + +# The first line is the column header; the body has one line per (cpu, edge). +head -n1 "monitors/$MON/stats" | grep -q "^# cpu edge label valid count sum_ns max_ns" +[ "$(grep -cvE '^#' "monitors/$MON/stats")" -gt 0 ] + +# Drive some scheduler activity so the automaton records transitions. +for _ in 1 2 3 4 5 6 7 8 9 10; do + (true) & + wait +done + +# At least one valid edge must now show a non-zero count. Do not require a +# non-zero dwell: a coarse local_clock() may legitimately return the same +# value twice. +grep -vE '^#' "monitors/$MON/stats" | \ + awk '$4 == 1 && $5 > 0 && $6 >= $7 { hit = 1 } END { exit !hit }' + +# An edge the model does not define must never be taken. +grep -vE '^#' "monitors/$MON/stats" | awk '$4 == 0 && $5 > 0 { exit 1 }' + +echo 0 > "monitors/$MON/enable" -- 2.53.0
