Re: [LTP] [PATCH] thermal: add new test group

Cyril Hrubis
2025-11-06T12:45:57Z

Hi!
First of all, the tst_test.sh test library is in maitenance mode and new
shell tests should use the tst_loader.sh instead. Have a look at the
testcases/kernel/mem/vma/vma05.sh test on how does it look like.

> diff --git a/testcases/kernel/thermal/thermal01.sh b/testcases/kernel/thermal/thermal01.sh
> new file mode 100755
> index 000000000..723591d94
> --- /dev/null
> +++ b/testcases/kernel/thermal/thermal01.sh
> @@ -0,0 +1,92 @@
> +#!/usr/bin/env bash
> +###############################################################################
> +# Copyright (C) 2025 Intel - http://www.intel.com/
> +#
> +# GNU General Public License for more details.
> +###############################################################################
> +# Contributors:
> +# Piotr Kubaj <piotr.kubaj@intel.com> (Intel)
> +# -Initial draft.
> +# Check 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.

This should be a doc comment instead, the doc comments are parsed and
exported into the LTP documentation:

# ---
# 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.
# ---

Also the tst_loader.sh supports for various metadata, since this test is
supported only on x86 platforms and I guess needs root we can specify
that in the environment as:

# ---
# env
# {
# "needs_root": true,
# "supported_archs": ["x86", "x86_64"]
# }
# ---

> +###############################################################################
> +
> +export TST_TESTFUNC=test_interrupt_events
> +export TCID="thermal_interrupt_events"
> +
> +pkg_thermal=""
> +thermal_zone_numbers=""
> +temp=""
> +temp_high=""
> +
> +test_interrupt_events() {
> + line=$(grep "Thermal event interrupts" /proc/interrupts)
> + if [ $? -eq 0 ]; then
> + interrupt_array_init=$(echo "$line" | tr -d "a-zA-Z:" | awk '{$1=$1;print}')
> + echo "Initial values of thermal interrupt counters: $interrupt_array_init"
> + num=$(nproc)
> + echo "Number of logical cores: $num"
> + else
> + tst_brk TBROK "Thermal event interrupts is not found."

This should be TCONF which means "test cannot run on this machine"
rather than TBROK which means "test is broken".

> + fi
> +
> + # Below we check for the thermal_zone which uses x86_pkg_temp driver
> + thermal_zone_numbers=$(grep -l x86_pkg_temp /sys/class/thermal/thermal_zone*/type | sed 's/[^0-9]//g' | tr -t '\n' ' ')
> + echo "x86_pkg_temp thermal zones: $thermal_zone_numbers"
> +
> + if [ -z $thermal_zone_numbers ]; then
> + tst_res TFAIL "No x86_pkg_temp thermal zones found"
> + fi

This should possibly be TCONF as well. Also this should be tst_brk
instead, since we will otherwise print the TPASS at the end of the
script.

> + for i in $thermal_zone_numbers; do
> + echo "Currently testing x86_pkg_temp thermal_zone$i"
> + TEMP=/sys/class/thermal/thermal_zone$i/temp
> + temp=$(cat "$TEMP")
> + echo "thermal_zone$i current temperature is $temp"
> + if [ "$(echo "$temp <= 0" | bc)" -eq 1 ]; then
> + tst_brk TBROK "Unexpected zone temperature value $temp"
> + fi
> + trip=$(cat /sys/class/thermal/thermal_zone$i/trip_point_1_temp)
> + # Setting trip_point_1_temp for termal_zone$i to $temp + 10 (0.001°C)
> + temp_high=$(( temp + 10 ))
> + echo $temp_high > /sys/class/thermal/thermal_zone$i/trip_point_1_temp
> + run_time=30
> + sleep_time=10
> + while [ $sleep_time -gt 0 ]; do
> + which -s stress-ng
> + [ $? -eq 0 ] || tst_brk TBROK "stress-ng is missing"
> + stress-ng --matrix 0 -t $run_time

We try to avoid dependencies on tools that are not installed by default
if possible. Looking around we do have genload tool in LTP already:

genload --cpu $(getconf _NPROCESSORS_ONLN) -t $run_time

> + temp_cur=$(cat "$TEMP")
> + echo "temp_cur: $temp_cur"
> + [ $temp_cur -gt $temp_high ] && break
> + 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 > /sys/class/thermal/thermal_zone$i/trip_point_1_temp
> +
> + # Check whether thermal interrupts count actually increased
> + interrupt_array_later=$(grep "Thermal event interrupts" /proc/interrupts | \
> + tr -d "a-zA-Z:" | awk '{$1=$1;print}')
> + echo "Current values of thermal interrupt counters: $interrupt_array_later"
> + for j in $(seq 1 "$num"); do
> + interrupt_later=$(echo "$interrupt_array_later" | cut -d " " -f "$j")
> + interrupt_init=$(echo "$interrupt_array_init" | cut -d " " -f "$j")
> + if [ $interrupt_later -le $interrupt_init ]; then
> + tst_res TFAIL "x86 package thermal interrupt did not trigger"
> + else
> + break
> + fi
> + done
> + done
> + tst_res TPASS "x86 package thermal interrupt triggered"
> +}
> +
> +. tst_test.sh
> +tst_run

--
Cyril Hrubis
chrubis@suse.cz