[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