rtla: Set distinctive exit value for failed tests

A test is considered failed when a sample trace exceeds the threshold.
Failed tests return the same exit code as passed tests, requiring test
frameworks to determine the result by searching for "hit stop tracing"
in the output.

Assign a distinct exit code for failed tests to enable the use of shell
expressions and seamless integration with testing frameworks without the
need to parse output.

Add enum type for return value.

Update `make check`.

Cc: Daniel Bristot de Oliveira <bristot@kernel.org>
Cc: John Kacur <jkacur@redhat.com>
Cc: "Luis Claudio R. Goncalves" <lgoncalv@redhat.com>
Cc: Eder Zulian <ezulian@redhat.com>
Cc: Dan Carpenter <dan.carpenter@linaro.org>
Cc: Jan Stancek <jstancek@redhat.com>
Link: https://lore.kernel.org/20250417185757.2194541-1-costa.shul@redhat.com
Signed-off-by: Costa Shulyupin <costa.shul@redhat.com>
Reviewed-by: Tomas Glozar <tglozar@redhat.com>
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
This commit is contained in:
Costa Shulyupin 2025-04-17 21:56:16 +03:00 committed by Steven Rostedt (Google)
parent 92a09c4746
commit 18682166f6
9 changed files with 34 additions and 21 deletions

View file

@ -766,8 +766,8 @@ int osnoise_hist_main(int argc, char *argv[])
struct osnoise_params *params; struct osnoise_params *params;
struct osnoise_tool *record = NULL; struct osnoise_tool *record = NULL;
struct osnoise_tool *tool = NULL; struct osnoise_tool *tool = NULL;
enum result return_value = ERROR;
struct trace_instance *trace; struct trace_instance *trace;
int return_value = 1;
int retval; int retval;
params = osnoise_hist_parse_args(argc, argv); params = osnoise_hist_parse_args(argc, argv);
@ -889,12 +889,13 @@ int osnoise_hist_main(int argc, char *argv[])
osnoise_print_stats(params, tool); osnoise_print_stats(params, tool);
return_value = 0; return_value = PASSED;
if (osnoise_trace_is_off(tool, record)) { if (osnoise_trace_is_off(tool, record)) {
printf("rtla osnoise hit stop tracing\n"); printf("rtla osnoise hit stop tracing\n");
save_trace_to_file(record ? record->trace.inst : NULL, save_trace_to_file(record ? record->trace.inst : NULL,
params->trace_output); params->trace_output);
return_value = FAILED;
} }
out_hist: out_hist:

View file

@ -594,8 +594,8 @@ int osnoise_top_main(int argc, char **argv)
struct osnoise_params *params; struct osnoise_params *params;
struct osnoise_tool *record = NULL; struct osnoise_tool *record = NULL;
struct osnoise_tool *tool = NULL; struct osnoise_tool *tool = NULL;
enum result return_value = ERROR;
struct trace_instance *trace; struct trace_instance *trace;
int return_value = 1;
int retval; int retval;
params = osnoise_top_parse_args(argc, argv); params = osnoise_top_parse_args(argc, argv);
@ -715,12 +715,13 @@ int osnoise_top_main(int argc, char **argv)
osnoise_print_stats(params, tool); osnoise_print_stats(params, tool);
return_value = 0; return_value = PASSED;
if (osnoise_trace_is_off(tool, record)) { if (osnoise_trace_is_off(tool, record)) {
printf("osnoise hit stop tracing\n"); printf("osnoise hit stop tracing\n");
save_trace_to_file(record ? record->trace.inst : NULL, save_trace_to_file(record ? record->trace.inst : NULL,
params->trace_output); params->trace_output);
return_value = FAILED;
} }
out_top: out_top:

View file

@ -1141,11 +1141,11 @@ int timerlat_hist_main(int argc, char *argv[])
struct timerlat_params *params; struct timerlat_params *params;
struct osnoise_tool *record = NULL; struct osnoise_tool *record = NULL;
struct timerlat_u_params params_u; struct timerlat_u_params params_u;
enum result return_value = ERROR;
struct osnoise_tool *tool = NULL; struct osnoise_tool *tool = NULL;
struct osnoise_tool *aa = NULL; struct osnoise_tool *aa = NULL;
struct trace_instance *trace; struct trace_instance *trace;
int dma_latency_fd = -1; int dma_latency_fd = -1;
int return_value = 1;
pthread_t timerlat_u; pthread_t timerlat_u;
int retval; int retval;
int nr_cpus, i; int nr_cpus, i;
@ -1378,7 +1378,7 @@ int timerlat_hist_main(int argc, char *argv[])
timerlat_print_stats(params, tool); timerlat_print_stats(params, tool);
return_value = 0; return_value = PASSED;
if (osnoise_trace_is_off(tool, record) && !stop_tracing) { if (osnoise_trace_is_off(tool, record) && !stop_tracing) {
printf("rtla timerlat hit stop tracing\n"); printf("rtla timerlat hit stop tracing\n");
@ -1388,6 +1388,7 @@ int timerlat_hist_main(int argc, char *argv[])
save_trace_to_file(record ? record->trace.inst : NULL, save_trace_to_file(record ? record->trace.inst : NULL,
params->trace_output); params->trace_output);
return_value = FAILED;
} }
out_hist: out_hist:

View file

@ -985,12 +985,12 @@ int timerlat_top_main(int argc, char *argv[])
struct timerlat_params *params; struct timerlat_params *params;
struct osnoise_tool *record = NULL; struct osnoise_tool *record = NULL;
struct timerlat_u_params params_u; struct timerlat_u_params params_u;
enum result return_value = ERROR;
struct osnoise_tool *top = NULL; struct osnoise_tool *top = NULL;
struct osnoise_tool *aa = NULL; struct osnoise_tool *aa = NULL;
struct trace_instance *trace; struct trace_instance *trace;
int dma_latency_fd = -1; int dma_latency_fd = -1;
pthread_t timerlat_u; pthread_t timerlat_u;
int return_value = 1;
char *max_lat; char *max_lat;
int retval; int retval;
int nr_cpus, i; int nr_cpus, i;
@ -1197,7 +1197,7 @@ int timerlat_top_main(int argc, char *argv[])
timerlat_print_stats(params, top); timerlat_print_stats(params, top);
return_value = 0; return_value = PASSED;
if (osnoise_trace_is_off(top, record) && !stop_tracing) { if (osnoise_trace_is_off(top, record) && !stop_tracing) {
printf("rtla timerlat hit stop tracing\n"); printf("rtla timerlat hit stop tracing\n");
@ -1207,6 +1207,7 @@ int timerlat_top_main(int argc, char *argv[])
save_trace_to_file(record ? record->trace.inst : NULL, save_trace_to_file(record ? record->trace.inst : NULL,
params->trace_output); params->trace_output);
return_value = FAILED;
} else if (params->aa_only) { } else if (params->aa_only) {
/* /*
* If the trace did not stop with --aa-only, at least print the * If the trace did not stop with --aa-only, at least print the

View file

@ -83,3 +83,9 @@ int auto_house_keeping(cpu_set_t *monitored_cpus);
#define ns_to_usf(x) (((double)x/1000)) #define ns_to_usf(x) (((double)x/1000))
#define ns_to_per(total, part) ((part * 100) / (double)total) #define ns_to_per(total, part) ((part * 100) / (double)total)
enum result {
PASSED = 0, /* same as EXIT_SUCCESS */
ERROR = 1, /* same as EXIT_FAILURE, an error in arguments */
FAILED = 2, /* test hit the stop tracing condition */
};

View file

@ -39,6 +39,7 @@ reset_osnoise() {
} }
check() { check() {
expected_exitcode=${3:-0}
# Simple check: run rtla with given arguments and test exit code. # Simple check: run rtla with given arguments and test exit code.
# If TEST_COUNT is set, run the test. Otherwise, just count. # If TEST_COUNT is set, run the test. Otherwise, just count.
ctr=$(($ctr + 1)) ctr=$(($ctr + 1))
@ -49,7 +50,7 @@ check() {
# Run rtla; in case of failure, include its output as comment # Run rtla; in case of failure, include its output as comment
# in the test results. # in the test results.
result=$(stdbuf -oL $TIMEOUT "$RTLA" $2 2>&1); exitcode=$? result=$(stdbuf -oL $TIMEOUT "$RTLA" $2 2>&1); exitcode=$?
if [ $exitcode -eq 0 ] if [ $exitcode -eq $expected_exitcode ]
then then
echo "ok $ctr - $1" echo "ok $ctr - $1"
else else
@ -68,12 +69,14 @@ check_with_osnoise_options() {
# Save original arguments # Save original arguments
arg1=$1 arg1=$1
arg2=$2 arg2=$2
arg3=$3
# Apply osnoise options (if not dry run) # Apply osnoise options (if not dry run)
if [ -n "$TEST_COUNT" ] if [ -n "$TEST_COUNT" ]
then then
[ "$NO_RESET_OSNOISE" == 1 ] || reset_osnoise [ "$NO_RESET_OSNOISE" == 1 ] || reset_osnoise
shift shift
shift
while shift while shift
do do
[ "$1" == "" ] && continue [ "$1" == "" ] && continue
@ -84,7 +87,7 @@ check_with_osnoise_options() {
done done
fi fi
NO_RESET_OSNOISE=1 check "$arg1" "$arg2" NO_RESET_OSNOISE=1 check "$arg1" "$arg2" "$arg3"
} }
set_timeout() { set_timeout() {

View file

@ -10,11 +10,11 @@ check "verify help page" \
check "detect noise higher than one microsecond" \ check "detect noise higher than one microsecond" \
"hwnoise -c 0 -T 1 -d 5s -q" "hwnoise -c 0 -T 1 -d 5s -q"
check "set the automatic trace mode" \ check "set the automatic trace mode" \
"hwnoise -a 5 -d 30s" "hwnoise -a 5 -d 30s" 2
check "set scheduling param to the osnoise tracer threads" \ check "set scheduling param to the osnoise tracer threads" \
"hwnoise -P F:1 -c 0 -r 900000 -d 1M -q" "hwnoise -P F:1 -c 0 -r 900000 -d 1M -q"
check "stop the trace if a single sample is higher than 1 us" \ check "stop the trace if a single sample is higher than 1 us" \
"hwnoise -s 1 -T 1 -t -d 30s" "hwnoise -s 1 -T 1 -t -d 30s" 2
check "enable a trace event trigger" \ check "enable a trace event trigger" \
"hwnoise -t -e osnoise:irq_noise trigger=\"hist:key=desc,duration:sort=desc,duration:vals=hitcount\" -d 1m" "hwnoise -t -e osnoise:irq_noise trigger=\"hist:key=desc,duration:sort=desc,duration:vals=hitcount\" -d 1m"

View file

@ -10,9 +10,9 @@ check "verify help page" \
check "verify the --priority/-P param" \ check "verify the --priority/-P param" \
"osnoise top -P F:1 -c 0 -r 900000 -d 1M -q" "osnoise top -P F:1 -c 0 -r 900000 -d 1M -q"
check "verify the --stop/-s param" \ check "verify the --stop/-s param" \
"osnoise top -s 30 -T 1 -t" "osnoise top -s 30 -T 1 -t" 2
check "verify the --trace param" \ check "verify the --trace param" \
"osnoise hist -s 30 -T 1 -t" "osnoise hist -s 30 -T 1 -t" 2
check "verify the --entries/-E param" \ check "verify the --entries/-E param" \
"osnoise hist -P F:1 -c 0 -r 900000 -d 1M -b 10 -E 25" "osnoise hist -P F:1 -c 0 -r 900000 -d 1M -b 10 -E 25"
@ -20,6 +20,6 @@ check "verify the --entries/-E param" \
# and stopping on threshold. # and stopping on threshold.
# If default period is not set, this will time out. # If default period is not set, this will time out.
check_with_osnoise_options "apply default period" \ check_with_osnoise_options "apply default period" \
"osnoise hist -s 1" period_us=600000000 "osnoise hist -s 1" 2 period_us=600000000
test_end test_end

View file

@ -21,21 +21,21 @@ export RTLA_NO_BPF=$option
check "verify help page" \ check "verify help page" \
"timerlat --help" "timerlat --help"
check "verify -s/--stack" \ check "verify -s/--stack" \
"timerlat top -s 3 -T 10 -t" "timerlat top -s 3 -T 10 -t" 2
check "verify -P/--priority" \ check "verify -P/--priority" \
"timerlat top -P F:1 -c 0 -d 1M -q" "timerlat top -P F:1 -c 0 -d 1M -q"
check "test in nanoseconds" \ check "test in nanoseconds" \
"timerlat top -i 2 -c 0 -n -d 30s" "timerlat top -i 2 -c 0 -n -d 30s" 2
check "set the automatic trace mode" \ check "set the automatic trace mode" \
"timerlat top -a 5 --dump-tasks" "timerlat top -a 5 --dump-tasks" 2
check "print the auto-analysis if hits the stop tracing condition" \ check "print the auto-analysis if hits the stop tracing condition" \
"timerlat top --aa-only 5" "timerlat top --aa-only 5" 2
check "disable auto-analysis" \ check "disable auto-analysis" \
"timerlat top -s 3 -T 10 -t --no-aa" "timerlat top -s 3 -T 10 -t --no-aa" 2
check "verify -c/--cpus" \ check "verify -c/--cpus" \
"timerlat hist -c 0 -d 30s" "timerlat hist -c 0 -d 30s"
check "hist test in nanoseconds" \ check "hist test in nanoseconds" \
"timerlat hist -i 2 -c 0 -n -d 30s" "timerlat hist -i 2 -c 0 -n -d 30s" 2
done done
test_end test_end