[LTP] [PATCH v4] thermal: add new test group
Petr Vorel
pvorel@suse.cz
Fri Nov 28 12:02:12 CET 2025
Hi Piotr,
> This is a new test for checking thermal interrupt events.
> stress-ng is used because genload doesn't seem to generate enough load.
> In particular, this version replaces use of tr and cut where awk is
> already used.
> --- /dev/null
> +++ b/runtest/thermal
> @@ -0,0 +1,3 @@
> +# Thermal driver API
> +# https://docs.kernel.org/driver-api/thermal/
> +thermal_interrupt_events thermal01.sh
I would not mind if the test itself was named thermal_interrupt_events.sh (more
descriptive), but that's a minor detail (which can be ignored or changed before
merge).
...
> +include $(top_srcdir)/include/mk/generic_leaf_target.mk
> diff --git a/testcases/kernel/thermal/thermal01.sh b/testcases/kernel/thermal/thermal01.sh
> new file mode 100755
> index 000000000..95adaf04b
> --- /dev/null
> +++ b/testcases/kernel/thermal/thermal01.sh
> @@ -0,0 +1,100 @@
> +#!/bin/sh
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +# Copyright (C) 2025 Intel - http://www.intel.com/
> +#
> +# ---
> +# doc
> +# Tests the CPU package thermal sensor interface for Intel platforms.
> +#
> +# It works by checking the initial count of thermal interrupts. Then it
> +# decreases the threshold for sending a thermal interrupt to just above
> +# the current temperature and runs a workload on the CPU. Finally, it restores
> +# the original thermal threshold and checks whether the number of thermal
> +# interrupts increased.
> +# ---
> +#
> +# ---
> +# env
> +# {
> +# "needs_root": true,
> +# "supported_archs": ["x86", "x86_64"],
> +# "needs_cmds": ["stress-ng"],
> +# "min_runtime": 180
> +# }
> +# ---
> +
> +. tst_loader.sh
> +
> +tst_test()
> +{
> + local thermal_zone_numbers=""
> + local temp
> + local temp_high=""
This could be just:
local thermal_zone_numbers temp temp_high
(empty shell variable is the same as ="").
> + local status=0
> +
> + local interrupt_array_init=$(awk -F'[^0-9]*' '/Thermal event interrupts/ {$1=$1;print}' /proc/interrupts)
> + if [ $? -eq 0 ]; then
> + tst_res TDEBUG "Initial values of thermal interrupt counters: $interrupt_array_init"
> + local num=$(tst_getconf _NPROCESSORS_ONLN)
> + tst_res TDEBUG "Number of logical cores: $num"
> + else
> + tst_brk TCONF "Thermal event interrupts is not found"
> + fi
> +
> + # Below we check for the thermal_zone which uses x86_pkg_temp driver
> + local thermal_zone_numbers=$(grep -l x86_pkg_temp /sys/class/thermal/thermal_zone*/type | xargs dirname)
> + tst_res TINFO "x86_pkg_temp thermal zones: $thermal_zone_numbers"
> +
> + if [ -z $thermal_zone_numbers ]; then
> + tst_brk TCONF "No x86_pkg_temp thermal zones found"
> + fi
> + for i in $thermal_zone_numbers; do
> + tst_res TINFO "Currently testing x86_pkg_temp $i"
> + local TEMP="$i/temp"
> + local temp=$(cat "$TEMP")
> + tst_res TDEBUG "$i's current temperature is $temp"
> + case $temp in
> + [0-9]*) ;;
> + *)
> + tst_brk TBROK "Unexpected zone temperature value $temp";;
> + esac
> + local trip=$(cat $i/trip_point_1_temp)
> + # Setting trip_point_1_temp for $i to $temp + 10 (0.001°C)
> + local temp_high=$(( temp + 10 ))
> + echo "$temp_high" > $i/trip_point_1_temp
> + local run_time=30
> + local sleep_time=10
> + while [ $sleep_time -gt 0 ]; do
> + ROD stress-ng --matrix 0 --timeout $run_time --quiet
> + local temp_cur=$(cat "$TEMP")
> + tst_res TDEBUG "temp_cur: $temp_cur"
> + [ $temp_cur -gt $temp_high ] && break
> + tst_sleep $sleep_time
> + run_time=$(( run_time - 3 ))
> + sleep_time=$(( sleep_time - 1 ))
> + done
> + [ $temp_cur -gt $temp_high ] || tst_res TFAIL "Zone temperature is not rising as expected"
> +
> + # Restore the original trip_point_1_temp value
> + echo "$trip" > $i/trip_point_1_temp
FYI this is in /sys, otherwise for creating temporary file we would need in the
env.
# "needs_tmpdir": true,
Thanks for your patch. I'm still not happy we introduce shell tests (sooner or
later somebody will invest his or his company time to rewrite that into C), but
I don't want to block this.
Reviewed-by: Petr Vorel <pvorel@suse.cz>
NOTE: this needs to wait till my patch which adds ROD() is merged.
https://lore.kernel.org/ltp/20251120161957.331580-1-pvorel@suse.cz/
Kind regards,
Petr
> +
> + # Check whether thermal interrupts count actually increased
> + local interrupt_array_later=$(awk -F'[^0-9]*' '/Thermal event interrupts/ {$1=$1;print}' /proc/interrupts)
> + tst_res TDEBUG "Current values of thermal interrupt counters: $interrupt_array_later"
> + for j in $(seq 1 "$num"); do
> + local interrupt_later=$(echo "$interrupt_array_later" | awk -v j=$j '{print $j}')
> + local interrupt_init=$(echo "$interrupt_array_init" | awk -v j=$j '{print $j}')
> + if [ $interrupt_later -le $interrupt_init ]; then
> + status=1
> + fi
> + done
> + done
> +
> + if [ $status -eq 0 ]; then
> + tst_res TPASS "x86 package thermal interrupt triggered"
> + else
> + tst_res TFAIL "x86 package thermal interrupt did not trigger"
> + fi
> +}
> +
> +. tst_run.sh
More information about the ltp
mailing list