public inbox for ltp@lists.linux.it
 help / color / mirror / Atom feed
* [LTP] [PATCH v2] thermal: add new test group
@ 2025-11-14 18:01 Piotr Kubaj
  2025-11-18 18:18 ` Cyril Hrubis
  0 siblings, 1 reply; 10+ messages in thread
From: Piotr Kubaj @ 2025-11-14 18:01 UTC (permalink / raw)
  To: ltp
  Cc: helena.anna.dubel, tomasz.ossowski, rafael.j.wysocki,
	daniel.niestepski, Piotr Kubaj

This is a new test for checking thermal interrupt events.
stress-ng is used because genload doesn't seem to generate enough load.

Signed-off-by: Piotr Kubaj <piotr.kubaj@intel.com>
---
 runtest/thermal                       |   2 +
 scenario_groups/default               |   1 +
 testcases/kernel/Makefile             |   1 +
 testcases/kernel/thermal/Makefile     |  11 +++
 testcases/kernel/thermal/thermal01.sh | 101 ++++++++++++++++++++++++++
 5 files changed, 116 insertions(+)
 create mode 100644 runtest/thermal
 create mode 100644 testcases/kernel/thermal/Makefile
 create mode 100755 testcases/kernel/thermal/thermal01.sh

diff --git a/runtest/thermal b/runtest/thermal
new file mode 100644
index 000000000..804ef7d79
--- /dev/null
+++ b/runtest/thermal
@@ -0,0 +1,2 @@
+#THERMAL
+thermal_interrupt_events thermal01.sh
diff --git a/scenario_groups/default b/scenario_groups/default
index 0e76b2bee..ffdd7ff25 100644
--- a/scenario_groups/default
+++ b/scenario_groups/default
@@ -26,3 +26,4 @@ crypto
 kernel_misc
 uevent
 watchqueue
+thermal
diff --git a/testcases/kernel/Makefile b/testcases/kernel/Makefile
index 98fd45a9d..ac816e4e8 100644
--- a/testcases/kernel/Makefile
+++ b/testcases/kernel/Makefile
@@ -36,6 +36,7 @@ SUBDIRS			+= connectors \
 			   sched \
 			   security \
 			   sound \
+			   thermal \
 			   tracing \
 			   uevents \
 			   watchqueue \
diff --git a/testcases/kernel/thermal/Makefile b/testcases/kernel/thermal/Makefile
new file mode 100644
index 000000000..789db430d
--- /dev/null
+++ b/testcases/kernel/thermal/Makefile
@@ -0,0 +1,11 @@
+# SPDX-License-Identifier: GPL-2.0-or-later
+# Copyright (c) 2025, Intel Corporation. All rights reserved.
+# Author:Piotr Kubaj <piotr.kubaj@intel.com>
+
+top_srcdir             ?= ../../..
+
+include $(top_srcdir)/include/mk/env_pre.mk
+
+INSTALL_TARGETS                := thermal01.sh
+
+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..138c30ee7
--- /dev/null
+++ b/testcases/kernel/thermal/thermal01.sh
@@ -0,0 +1,101 @@
+#!/usr/bin/env bash
+# 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"]
+# }
+# ---
+
+export LTP_TIMEOUT_MUL=6
+
+. tst_loader.sh
+
+thermal_zone_numbers=""
+temp=""
+temp_high=""
+status=0
+
+tst_test()
+{
+	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 TCONF "Thermal event interrupts is not found."
+	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_brk TCONF "No x86_pkg_temp thermal zones found"
+	fi
+	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
+			stress-ng --matrix 0 --timeout $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
+				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
-- 
2.47.3

---------------------------------------------------------------------
Intel Technology Poland sp. z o.o.
ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | Kapital zakladowy 200.000 PLN.
Spolka oswiadcza, ze posiada status duzego przedsiebiorcy w rozumieniu ustawy z dnia 8 marca 2013 r. o przeciwdzialaniu nadmiernym opoznieniom w transakcjach handlowych.

Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i moze zawierac informacje poufne. W razie przypadkowego otrzymania tej wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione.
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [LTP] [PATCH v2] thermal: add new test group
  2025-11-14 18:01 [LTP] [PATCH v2] thermal: add new test group Piotr Kubaj
@ 2025-11-18 18:18 ` Cyril Hrubis
  2025-11-19  9:35   ` Cyril Hrubis
  0 siblings, 1 reply; 10+ messages in thread
From: Cyril Hrubis @ 2025-11-18 18:18 UTC (permalink / raw)
  To: Piotr Kubaj
  Cc: daniel.niestepski, tomasz.ossowski, helena.anna.dubel,
	rafael.j.wysocki, ltp

Hi!
> Signed-off-by: Piotr Kubaj <piotr.kubaj@intel.com>
> ---
>  runtest/thermal                       |   2 +
>  scenario_groups/default               |   1 +
>  testcases/kernel/Makefile             |   1 +
>  testcases/kernel/thermal/Makefile     |  11 +++
>  testcases/kernel/thermal/thermal01.sh | 101 ++++++++++++++++++++++++++
>  5 files changed, 116 insertions(+)
>  create mode 100644 runtest/thermal
>  create mode 100644 testcases/kernel/thermal/Makefile
>  create mode 100755 testcases/kernel/thermal/thermal01.sh
> 
> diff --git a/runtest/thermal b/runtest/thermal
> new file mode 100644
> index 000000000..804ef7d79
> --- /dev/null
> +++ b/runtest/thermal
> @@ -0,0 +1,2 @@
> +#THERMAL
> +thermal_interrupt_events thermal01.sh
> diff --git a/scenario_groups/default b/scenario_groups/default
> index 0e76b2bee..ffdd7ff25 100644
> --- a/scenario_groups/default
> +++ b/scenario_groups/default
> @@ -26,3 +26,4 @@ crypto
>  kernel_misc
>  uevent
>  watchqueue
> +thermal
> diff --git a/testcases/kernel/Makefile b/testcases/kernel/Makefile
> index 98fd45a9d..ac816e4e8 100644
> --- a/testcases/kernel/Makefile
> +++ b/testcases/kernel/Makefile
> @@ -36,6 +36,7 @@ SUBDIRS			+= connectors \
>  			   sched \
>  			   security \
>  			   sound \
> +			   thermal \
>  			   tracing \
>  			   uevents \
>  			   watchqueue \
> diff --git a/testcases/kernel/thermal/Makefile b/testcases/kernel/thermal/Makefile
> new file mode 100644
> index 000000000..789db430d
> --- /dev/null
> +++ b/testcases/kernel/thermal/Makefile
> @@ -0,0 +1,11 @@
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +# Copyright (c) 2025, Intel Corporation. All rights reserved.
> +# Author:Piotr Kubaj <piotr.kubaj@intel.com>
> +
> +top_srcdir             ?= ../../..
> +
> +include $(top_srcdir)/include/mk/env_pre.mk
> +
> +INSTALL_TARGETS                := thermal01.sh
> +
> +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..138c30ee7
> --- /dev/null
> +++ b/testcases/kernel/thermal/thermal01.sh
> @@ -0,0 +1,101 @@
> +#!/usr/bin/env bash
> +# 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"]
> +# }
> +# ---
> +
> +export LTP_TIMEOUT_MUL=6

Instead of this the test needs to set up runtime in the environment
properly. I will send a patch for the tst_run_shell.c that adds support
for runtime to the JSON env tomorrow.

> +. tst_loader.sh
> +
> +thermal_zone_numbers=""
> +temp=""
> +temp_high=""
> +status=0
> +
> +tst_test()
> +{
> +	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"

All these echo should be tst_res TINFO "..." or tst_res TDEBUG "..."
(not shown by default) messages instead, so that the test verbosity can
be properly controlled.

> +		num=$(nproc)
> +		echo "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
> +	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_brk TCONF "No x86_pkg_temp thermal zones found"
> +	fi
> +	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

bc package is not installed by default on certain systems, so we either
need to request it explicitly or not use it.

What about:

		case "$TEMP" in
		[0-9]*) ;;
		*)
			tst_brk TBROK "Unexpected zone temperature value $temp";;
		esac

> +			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
> +			stress-ng --matrix 0 --timeout $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
> +				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
> -- 
> 2.47.3
> 
> ---------------------------------------------------------------------
> Intel Technology Poland sp. z o.o.
> ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | Kapital zakladowy 200.000 PLN.
> Spolka oswiadcza, ze posiada status duzego przedsiebiorcy w rozumieniu ustawy z dnia 8 marca 2013 r. o przeciwdzialaniu nadmiernym opoznieniom w transakcjach handlowych.
> 
> Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i moze zawierac informacje poufne. W razie przypadkowego otrzymania tej wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione.
> This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.
> 
> -- 
> Mailing list info: https://lists.linux.it/listinfo/ltp

-- 
Cyril Hrubis
chrubis@suse.cz

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [LTP] [PATCH v2] thermal: add new test group
  2025-11-18 18:18 ` Cyril Hrubis
@ 2025-11-19  9:35   ` Cyril Hrubis
  0 siblings, 0 replies; 10+ messages in thread
From: Cyril Hrubis @ 2025-11-19  9:35 UTC (permalink / raw)
  To: Piotr Kubaj
  Cc: tomasz.ossowski, helena.anna.dubel, ltp, rafael.j.wysocki,
	daniel.niestepski

Hi!
> > +# ---
> > +# env
> > +# {
> > +#  "needs_root": true,
> > +#  "supported_archs": ["x86", "x86_64"],
> > +#  "needs_cmds": ["stress-ng"]
> > +# }
> > +# ---
> > +
> > +export LTP_TIMEOUT_MUL=6
> 
> Instead of this the test needs to set up runtime in the environment
> properly. I will send a patch for the tst_run_shell.c that adds support
> for runtime to the JSON env tomorrow.

Patch send. All you need to do in this test is to set the "min_runtime"
to the upper bound of the time the test will take and the test timeout
should be calculated accordingly.

-- 
Cyril Hrubis
chrubis@suse.cz

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [LTP] [PATCH v2] thermal: add new test group
@ 2026-01-20 14:46 Piotr Kubaj
  2026-01-20 19:38 ` Petr Vorel
  0 siblings, 1 reply; 10+ messages in thread
From: Piotr Kubaj @ 2026-01-20 14:46 UTC (permalink / raw)
  To: ltp; +Cc: helena.anna.dubel, tomasz.ossowski, rafael.j.wysocki,
	daniel.niestepski

This is a new test for checking thermal interrupt events.
The new version corrects all the warnings and errors found by `make
check` and Github Actions.

Signed-off-by: Piotr Kubaj <piotr.kubaj@intel.com>
---
 runtest/thermal                               |   3 +
 scenario_groups/default                       |   1 +
 testcases/kernel/Makefile                     |   1 +
 testcases/kernel/thermal/Makefile             |  11 +
 .../kernel/thermal/thermal_interrupt_events.c | 195 ++++++++++++++++++
 5 files changed, 211 insertions(+)
 create mode 100644 runtest/thermal
 create mode 100644 testcases/kernel/thermal/Makefile
 create mode 100644 testcases/kernel/thermal/thermal_interrupt_events.c

diff --git a/runtest/thermal b/runtest/thermal
new file mode 100644
index 000000000..b85237f95
--- /dev/null
+++ b/runtest/thermal
@@ -0,0 +1,3 @@
+# Thermal driver API
+# https://docs.kernel.org/driver-api/thermal/
+thermal_interrupt_events thermal_interrupt_events.sh
diff --git a/scenario_groups/default b/scenario_groups/default
index 0e76b2bee..ffdd7ff25 100644
--- a/scenario_groups/default
+++ b/scenario_groups/default
@@ -26,3 +26,4 @@ crypto
 kernel_misc
 uevent
 watchqueue
+thermal
diff --git a/testcases/kernel/Makefile b/testcases/kernel/Makefile
index 98fd45a9d..ac816e4e8 100644
--- a/testcases/kernel/Makefile
+++ b/testcases/kernel/Makefile
@@ -36,6 +36,7 @@ SUBDIRS			+= connectors \
 			   sched \
 			   security \
 			   sound \
+			   thermal \
 			   tracing \
 			   uevents \
 			   watchqueue \
diff --git a/testcases/kernel/thermal/Makefile b/testcases/kernel/thermal/Makefile
new file mode 100644
index 000000000..04a4360d0
--- /dev/null
+++ b/testcases/kernel/thermal/Makefile
@@ -0,0 +1,11 @@
+# SPDX-License-Identifier: GPL-2.0-or-later
+# Copyright (c) 2025, Intel Corporation. All rights reserved.
+# Author:Piotr Kubaj <piotr.kubaj@intel.com>
+
+top_srcdir             ?= ../../..
+
+include $(top_srcdir)/include/mk/testcases.mk
+
+thermal_interrupt_events: LDLIBS    += -lpthread
+
+include $(top_srcdir)/include/mk/generic_leaf_target.mk
diff --git a/testcases/kernel/thermal/thermal_interrupt_events.c b/testcases/kernel/thermal/thermal_interrupt_events.c
new file mode 100644
index 000000000..edd75aff4
--- /dev/null
+++ b/testcases/kernel/thermal/thermal_interrupt_events.c
@@ -0,0 +1,195 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+/*
+ * Copyright (C) 2025-2026 Intel - http://www.intel.com/
+ */
+
+/*
+ * Tests the CPU package thermal sensor interface for Intel platforms.
+
+ * 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.
+ */
+
+#include "tst_safe_stdio.h"
+#include "tst_test.h"
+#include <ctype.h>
+#include <pthread.h>
+#include <regex.h>
+#define	PATH_LEN	69
+#define	STRING_LEN	23
+
+static void *cpu_workload(void *arg)
+{
+	time_t start_time = time(NULL);
+	int num = 2;
+
+	while (difftime(time(NULL), start_time) < *(double *)arg) {
+		for (int i = 2; i * i <= num; i++) {
+			if (num % i == 0)
+				break;
+		}
+		num++;
+	}
+	return NULL;
+}
+
+static void read_interrupts(uint64_t *interrupt_array, const uint16_t nproc)
+{
+	bool interrupts_found = 0;
+	char line[8192];
+
+	memset(interrupt_array, 0, nproc * sizeof(*interrupt_array));
+	FILE *fp = SAFE_FOPEN("/proc/interrupts", "r");
+
+	while (fgets(line, sizeof(line), fp)) {
+		if (strstr(line, "Thermal event interrupts")) {
+			interrupts_found = 1;
+			char *token = strtok(line, " ");
+
+			token = strtok(NULL, " ");
+			int i = 0;
+
+			while (!!strncmp(token, "Thermal", 7)) {
+				interrupt_array[i++] = atoll(token);
+				token = strtok(NULL, " ");
+				tst_res(TDEBUG, "Current value of interrupt_array[%d]: %ld", i - 1, interrupt_array[i - 1]);
+			}
+		}
+	}
+	SAFE_FCLOSE(fp);
+	if (!interrupts_found)
+		tst_brk(TCONF, "No Thermal event interrupts line in /proc/interrupts");
+}
+
+static void run(void)
+{
+	bool status = 1;
+	char line[8192];
+	const uint16_t nproc = tst_ncpus();
+	uint64_t interrupt_init[nproc], interrupt_later[nproc];
+
+	tst_res(TDEBUG, "Number of logical cores: %d", nproc);
+	read_interrupts(interrupt_init, nproc);
+
+	DIR *dir;
+
+	dir = SAFE_OPENDIR("/sys/class/thermal/");
+	struct dirent *entry;
+	regex_t regex;
+	uint8_t tz_counter = 0;
+
+	if (regcomp(&regex, "thermal_zone", REG_EXTENDED) != 0)
+		tst_res(TINFO | TTERRNO, "regcomp");
+
+	while ((entry = readdir(dir)) != NULL) {
+		if (regexec(&regex, entry->d_name, 0, NULL, 0) == 0)
+			tz_counter++;
+	}
+	SAFE_CLOSEDIR(dir);
+	regfree(&regex);
+	tst_res(TDEBUG, "Found %d thermal zone(s)", tz_counter);
+
+	bool x86_pkg_temp_tz[tz_counter], x86_pkg_temp_tz_found = 0;
+
+	memset(x86_pkg_temp_tz, 0, sizeof(x86_pkg_temp_tz));
+
+	for (uint8_t i = 0; i < tz_counter; i++) {
+		char path[PATH_LEN];
+
+		snprintf(path, PATH_LEN, "/sys/class/thermal/thermal_zone%d/type", i);
+		FILE *fp = SAFE_FOPEN(path, "r");
+
+		if (fgets(line, sizeof(line), fp) && strstr(line, "x86_pkg_temp")) {
+			tst_res(TDEBUG, "Thermal zone %d uses x86_pkg_temp", i);
+			x86_pkg_temp_tz[i] = 1;
+			x86_pkg_temp_tz_found = 1;
+		}
+		SAFE_FCLOSE(fp);
+	}
+	if (!x86_pkg_temp_tz_found) {
+		tst_res(TINFO, "No thermal zone uses x86_pkg_temp");
+		status = 0;
+	}
+
+	for (uint8_t i = 0; i < tz_counter; i++) {
+		if (x86_pkg_temp_tz[i]) {
+			char path[PATH_LEN], temp_path[PATH_LEN], trip_path[PATH_LEN], temp_high[12], trip[12];
+			double run_time = 30;
+			uint8_t sleep_time = 10;
+			int temp;
+
+			snprintf(path, PATH_LEN, "/sys/class/thermal/thermal_zone%d/", i);
+			strncpy(temp_path, path, PATH_LEN);
+			strncat(temp_path, "temp", 4);
+			tst_res(TDEBUG, "Testing %s", temp_path);
+			SAFE_FILE_SCANF(temp_path, "%d", &temp);
+			if (temp < 0) {
+				tst_brk(TBROK, "Unexpected zone temperature value %d", temp);
+				status = 0;
+			}
+			tst_res(TDEBUG, "Current temperature for %s: %d", path, temp);
+
+			snprintf(temp_high, sizeof(temp_high), "%d", temp + 10);
+
+			strncpy(trip_path, path, PATH_LEN);
+			strncat(trip_path, "trip_point_1_temp", 17);
+
+			tst_res(TDEBUG, "Setting new trip_point_1_temp value: %s", temp_high);
+			SAFE_FILE_SCANF(trip_path, "%s", trip);
+			SAFE_FILE_PRINTF(trip_path, "%s", temp_high);
+
+			while (sleep_time > 0) {
+				tst_res(TDEBUG, "Running for %f seconds, then sleeping for %d seconds", run_time, sleep_time);
+				pthread_t threads[nproc];
+
+				for (uint16_t j = 0; j < nproc; j++)
+					pthread_create(&threads[j], NULL, cpu_workload, &run_time);
+				for (uint16_t j = 0; j < nproc; j++)
+					pthread_join(threads[j], NULL);
+
+				SAFE_FILE_SCANF(temp_path, "%d", &temp);
+				tst_res(TDEBUG, "Temperature for %s after a test: %d", path, temp);
+
+				if (temp > atol(temp_high))
+					break;
+				sleep(sleep_time--);
+				run_time -= 3;
+			}
+			if (temp <= atol(temp_high)) {
+				tst_res(TINFO, "Zone temperature is not rising as expected");
+				status = 0;
+			}
+
+			tst_res(TDEBUG, "Restoring original trip_point_1_temp value: %s", trip);
+			SAFE_FILE_PRINTF(trip_path, "%s", trip);
+		}
+	}
+	read_interrupts(interrupt_later, nproc);
+
+	for (uint16_t i = 0; i < nproc; i++) {
+		if (interrupt_later[i] < interrupt_init[i]) {
+			tst_res(TINFO, "For CPU %d interrupt counter is currently %ld, while it was %ld before the test", i, interrupt_later[i], interrupt_init[i]);
+			status = 0;
+		}
+	}
+
+	if (status)
+		tst_res(TPASS, "x86 package thermal interrupt triggered");
+	else
+		tst_res(TFAIL, "x86 package thermal interrupt did not trigger");
+}
+
+static struct tst_test test = {
+	.min_runtime = 180,
+	.needs_root = true,
+	.supported_archs = (const char *const []) {
+		"x86",
+		"x86_64",
+		NULL
+	},
+	.test_all = run
+};
-- 
2.47.3

---------------------------------------------------------------------
Intel Technology Poland sp. z o.o.
ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | Kapital zakladowy 200.000 PLN.
Spolka oswiadcza, ze posiada status duzego przedsiebiorcy w rozumieniu ustawy z dnia 8 marca 2013 r. o przeciwdzialaniu nadmiernym opoznieniom w transakcjach handlowych.

Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i moze zawierac informacje poufne. W razie przypadkowego otrzymania tej wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione.
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.


-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [LTP] [PATCH v2] thermal: add new test group
  2026-01-20 14:46 Piotr Kubaj
@ 2026-01-20 19:38 ` Petr Vorel
  2026-01-21 11:55   ` Kubaj, Piotr
  0 siblings, 1 reply; 10+ messages in thread
From: Petr Vorel @ 2026-01-20 19:38 UTC (permalink / raw)
  To: Piotr Kubaj
  Cc: daniel.niestepski, tomasz.ossowski, helena.anna.dubel,
	rafael.j.wysocki, ltp

Hi Piotr,

> --- /dev/null
> +++ b/runtest/thermal
> @@ -0,0 +1,3 @@
> +# Thermal driver API
> +# https://docs.kernel.org/driver-api/thermal/
> +thermal_interrupt_events thermal_interrupt_events.sh
You rewritten test into C :).
thermal_interrupt_events thermal_interrupt_events

I tried to run test under root:

# ./thermal_interrupt_events
tst_test.c:1856: TINFO: Overall timeout per run is 0h 03m 30s
thermal_interrupt_events.c:168: TBROK: Failed to close FILE '/sys/class/thermal/thermal_zone1/trip_point_1_temp': EINVAL (22)

But later it worked:
tst_test.c:2028: TINFO: LTP version: 20250930-134-g02805b05a1
tst_test.c:2031: TINFO: Tested kernel: 6.17.12+deb14-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.17.12-1 (2025-12-14) x86_64
tst_kconfig.c:88: TINFO: Parsing kernel config '/boot/config-6.17.12+deb14-amd64'
tst_test.c:1856: TINFO: Overall timeout per run is 0h 03m 30s
thermal_interrupt_events.c:181: TPASS: x86 package thermal interrupt triggered

I wonder what was wrong.

...
> --- /dev/null
> +++ b/testcases/kernel/thermal/thermal_interrupt_events.c

Whole C code asks for cleanup and simplification.

> @@ -0,0 +1,195 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +
> +/*
> + * Copyright (C) 2025-2026 Intel - http://www.intel.com/
> + */
> +
> +/*
Please use /*\ instead of /* to get test description into our test catalog:
https://linux-test-project.readthedocs.io/en/latest/users/test_catalog.html

> + * Tests the CPU package thermal sensor interface for Intel platforms.
> +
> + * 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.
> + */
> +
> +#include "tst_safe_stdio.h"
> +#include "tst_test.h"
> +#include <ctype.h>
> +#include <pthread.h>
> +#include <regex.h>
> +#define	PATH_LEN	69
> +#define	STRING_LEN	23
> +
> +static void *cpu_workload(void *arg)
> +{
> +	time_t start_time = time(NULL);
> +	int num = 2;
> +
> +	while (difftime(time(NULL), start_time) < *(double *)arg) {
> +		for (int i = 2; i * i <= num; i++) {
> +			if (num % i == 0)
> +				break;
> +		}
> +		num++;
> +	}
> +	return NULL;
> +}
> +
> +static void read_interrupts(uint64_t *interrupt_array, const uint16_t nproc)
> +{
> +	bool interrupts_found = 0;
> +	char line[8192];
very nit: IMHO 1024 would be more than enough, but whatever.
> +
> +	memset(interrupt_array, 0, nproc * sizeof(*interrupt_array));
> +	FILE *fp = SAFE_FOPEN("/proc/interrupts", "r");
> +
> +	while (fgets(line, sizeof(line), fp)) {
> +		if (strstr(line, "Thermal event interrupts")) {
Can't we use FILE_LINES_SCANF() or SAFE_FILE_LINES_SCANF() to instead of whole
while() block to simplify?

See example code
https://github.com/linux-test-project/ltp/tree/master/lib/newlib_tests/tst_safe_fileops.c

> +			interrupts_found = 1;
> +			char *token = strtok(line, " ");
> +
> +			token = strtok(NULL, " ");
> +			int i = 0;
> +
> +			while (!!strncmp(token, "Thermal", 7)) {
> +				interrupt_array[i++] = atoll(token);
> +				token = strtok(NULL, " ");
> +				tst_res(TDEBUG, "Current value of interrupt_array[%d]: %ld", i - 1, interrupt_array[i - 1]);
> +			}
> +		}
> +	}
> +	SAFE_FCLOSE(fp);
> +	if (!interrupts_found)
> +		tst_brk(TCONF, "No Thermal event interrupts line in /proc/interrupts");
> +}
> +
> +static void run(void)
> +{
> +	bool status = 1;
> +	char line[8192];
> +	const uint16_t nproc = tst_ncpus();
I'd say just use int.

https://github.com/linux-test-project/ltp/blob/master/doc/old/C-Test-API.asciidoc#11-basic-test-structure
	The overall test initialization is done in the setup() function.
=> this would apply to tst_ncpus() result.

If there is any preliminary checking before testing (e.g. content of
/proc/interrupts) it should be in setup() function.

=> but this can be used for checking as well.
One of these would be tst_ncpus() result.

This helps to quit early.

> +	uint64_t interrupt_init[nproc], interrupt_later[nproc];
> +
> +	tst_res(TDEBUG, "Number of logical cores: %d", nproc);
> +	read_interrupts(interrupt_init, nproc);
> +
> +	DIR *dir;
> +
> +	dir = SAFE_OPENDIR("/sys/class/thermal/");
> +	struct dirent *entry;
> +	regex_t regex;
> +	uint8_t tz_counter = 0;
> +
> +	if (regcomp(&regex, "thermal_zone", REG_EXTENDED) != 0)
regex is overkill.  Because we search for /sys/class/thermal/thermal_zone[0-9],
we can simply traverse dirent and check it with strncmp().
Other option would be to use glob() but even that is IMHO too much.
And this searching should be in setup() right? (does not change during test run,
why to do it more than once when run test with -i, e.g. -i3.

> +		tst_res(TINFO | TTERRNO, "regcomp");
> +
> +	while ((entry = readdir(dir)) != NULL) {
> +		if (regexec(&regex, entry->d_name, 0, NULL, 0) == 0)
> +			tz_counter++;
> +	}
> +	SAFE_CLOSEDIR(dir);
> +	regfree(&regex);
> +	tst_res(TDEBUG, "Found %d thermal zone(s)", tz_counter);
> +
> +	bool x86_pkg_temp_tz[tz_counter], x86_pkg_temp_tz_found = 0;
> +
> +	memset(x86_pkg_temp_tz, 0, sizeof(x86_pkg_temp_tz));
> +
> +	for (uint8_t i = 0; i < tz_counter; i++) {
> +		char path[PATH_LEN];
> +
> +		snprintf(path, PATH_LEN, "/sys/class/thermal/thermal_zone%d/type", i);
> +		FILE *fp = SAFE_FOPEN(path, "r");
You print too many TDEBUG. Why don't you print opened
/sys/class/thermal/thermal_zone%d/type file?
> +
> +		if (fgets(line, sizeof(line), fp) && strstr(line, "x86_pkg_temp")) {
Please use SAFE_FILE_SCANF() or FILE_SCANF()
https://github.com/linux-test-project/ltp/blob/master/doc/old/C-Test-API.asciidoc#14-safe-macros

Kind regards,
Petr

> +			tst_res(TDEBUG, "Thermal zone %d uses x86_pkg_temp", i);
> +			x86_pkg_temp_tz[i] = 1;
> +			x86_pkg_temp_tz_found = 1;
> +		}
> +		SAFE_FCLOSE(fp);
> +	}
> +	if (!x86_pkg_temp_tz_found) {
> +		tst_res(TINFO, "No thermal zone uses x86_pkg_temp");
> +		status = 0;
> +	}
...

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [LTP] [PATCH v2] thermal: add new test group
  2026-01-20 19:38 ` Petr Vorel
@ 2026-01-21 11:55   ` Kubaj, Piotr
  2026-01-21 23:06     ` Petr Vorel
  2026-01-22 14:27     ` Petr Vorel
  0 siblings, 2 replies; 10+ messages in thread
From: Kubaj, Piotr @ 2026-01-21 11:55 UTC (permalink / raw)
  To: pvorel@suse.cz
  Cc: Wysocki, Rafael J, Ossowski, Tomasz, Dubel, Helena Anna,
	Niestepski, Daniel, ltp@lists.linux.it

Comments inline.

2026-01-20 (火) の 20:38 +0100 に Petr Vorel さんは書きました:
> Hi Piotr,
> 
> > --- /dev/null
> > +++ b/runtest/thermal
> > @@ -0,0 +1,3 @@
> > +# Thermal driver API
> > +# https://docs.kernel.org/driver-api/thermal/
> > +thermal_interrupt_events thermal_interrupt_events.sh
> You rewritten test into C :).
> thermal_interrupt_events thermal_interrupt_events
> 
> I tried to run test under root:
> 
> # ./thermal_interrupt_events
> tst_test.c:1856: TINFO: Overall timeout per run is 0h 03m 30s
> thermal_interrupt_events.c:168: TBROK: Failed to close FILE
> '/sys/class/thermal/thermal_zone1/trip_point_1_temp': EINVAL (22)
> 
> But later it worked:
> tst_test.c:2028: TINFO: LTP version: 20250930-134-g02805b05a1
> tst_test.c:2031: TINFO: Tested kernel: 6.17.12+deb14-amd64 #1 SMP
> PREEMPT_DYNAMIC Debian 6.17.12-1 (2025-12-14) x86_64
> tst_kconfig.c:88: TINFO: Parsing kernel config '/boot/config-
> 6.17.12+deb14-amd64'
> tst_test.c:1856: TINFO: Overall timeout per run is 0h 03m 30s
> thermal_interrupt_events.c:181: TPASS: x86 package thermal interrupt
> triggered
> 
> I wonder what was wrong.
Can you check if the test fails again the 1st time after a reboot? If
I'm correct, it might be a reproduction of the bug due to be fixed in
https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git/patch/?id=39b1bd1613b8f73994f654988ad75a72b633f5e2

> 
> ...
> > --- /dev/null
> > +++ b/testcases/kernel/thermal/thermal_interrupt_events.c
> 
> Whole C code asks for cleanup and simplification.
> 
> > @@ -0,0 +1,195 @@
> > +// SPDX-License-Identifier: GPL-2.0-or-later
> > +
> > +/*
> > + * Copyright (C) 2025-2026 Intel - http://www.intel.com/
> > + */
> > +
> > +/*
> Please use /*\ instead of /* to get test description into our test
> catalog:
> https://linux-test-project.readthedocs.io/en/latest/users/test_catalog.html
OK, will do.

> 
> > + * Tests the CPU package thermal sensor interface for Intel
> > platforms.
> > +
> > + * 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.
> > + */
> > +
> > +#include "tst_safe_stdio.h"
> > +#include "tst_test.h"
> > +#include <ctype.h>
> > +#include <pthread.h>
> > +#include <regex.h>
> > +#define	PATH_LEN	69
> > +#define	STRING_LEN	23
> > +
> > +static void *cpu_workload(void *arg)
> > +{
> > +	time_t start_time = time(NULL);
> > +	int num = 2;
> > +
> > +	while (difftime(time(NULL), start_time) < *(double *)arg)
> > {
> > +		for (int i = 2; i * i <= num; i++) {
> > +			if (num % i == 0)
> > +				break;
> > +		}
> > +		num++;
> > +	}
> > +	return NULL;
> > +}
> > +
> > +static void read_interrupts(uint64_t *interrupt_array, const
> > uint16_t nproc)
> > +{
> > +	bool interrupts_found = 0;
> > +	char line[8192];
> very nit: IMHO 1024 would be more than enough, but whatever.
And I wasn't even sure 8192 would be enough. The reason is that, since
it's a string, every digit is a single array element. With new 2S or 4S
systems with hundreds of cores and each interrupt being up to 2^64,
even 8192 might not be enough.

> > +
> > +	memset(interrupt_array, 0, nproc *
> > sizeof(*interrupt_array));
> > +	FILE *fp = SAFE_FOPEN("/proc/interrupts", "r");
> > +
> > +	while (fgets(line, sizeof(line), fp)) {
> > +		if (strstr(line, "Thermal event interrupts")) {
> Can't we use FILE_LINES_SCANF() or SAFE_FILE_LINES_SCANF() to instead
> of whole
> while() block to simplify?
> 
> See example code
> https://github.com/linux-test-project/ltp/tree/master/lib/newlib_tests/tst_safe_fileops.c
It's quite unclear to me. SAFE_FILE_LINES_SCANF() seems fine for
reading a single interrupt number or even multiple, but only when well
known how many cores we have. Here the number of elements in the array
is equal to the number of logical cores the system has, in my case
it's:
 TRM:       7795       7795       7795       7795       7800       7800
7797       7797       7795       7795       7886       7886       7860
7860       7863       7863       7795       7795       7795       7795
7795       7795       7795       7795   Thermal event interrupts

I tried:
SAFE_FILE_LINES_SCANF("/proc/interrupts", " TRM:%sThermal event
interrupts", line);

to fit all the numbers in "line" string and then later parse them, but
only the 1st number is read. Here we need to have all of them. 

> 
> > +			interrupts_found = 1;
> > +			char *token = strtok(line, " ");
> > +
> > +			token = strtok(NULL, " ");
> > +			int i = 0;
> > +
> > +			while (!!strncmp(token, "Thermal", 7)) {
> > +				interrupt_array[i++] =
> > atoll(token);
> > +				token = strtok(NULL, " ");
> > +				tst_res(TDEBUG, "Current value of
> > interrupt_array[%d]: %ld", i - 1, interrupt_array[i - 1]);
> > +			}
> > +		}
> > +	}
> > +	SAFE_FCLOSE(fp);
> > +	if (!interrupts_found)
> > +		tst_brk(TCONF, "No Thermal event interrupts line
> > in /proc/interrupts");
> > +}
> > +
> > +static void run(void)
> > +{
> > +	bool status = 1;
> > +	char line[8192];
> > +	const uint16_t nproc = tst_ncpus();
> I'd say just use int.
OK.

> 
> https://github.com/linux-test-project/ltp/blob/master/doc/old/C-Test-API.asciidoc#11-basic-test-structure
> 	The overall test initialization is done in the setup()
> function.
> => this would apply to tst_ncpus() result.
> 
> If there is any preliminary checking before testing (e.g. content of
> /proc/interrupts) it should be in setup() function.
> 
> => but this can be used for checking as well.
> One of these would be tst_ncpus() result.
> 
> This helps to quit early.
I know, but nproc variable is later used to launch the exactly $nproc
instances of cpu workload.

> 
> > +	uint64_t interrupt_init[nproc], interrupt_later[nproc];
> > +
> > +	tst_res(TDEBUG, "Number of logical cores: %d", nproc);
> > +	read_interrupts(interrupt_init, nproc);
> > +
> > +	DIR *dir;
> > +
> > +	dir = SAFE_OPENDIR("/sys/class/thermal/");
> > +	struct dirent *entry;
> > +	regex_t regex;
> > +	uint8_t tz_counter = 0;
> > +
> > +	if (regcomp(&regex, "thermal_zone", REG_EXTENDED) != 0)
> regex is overkill.  Because we search for
> /sys/class/thermal/thermal_zone[0-9],
> we can simply traverse dirent and check it with strncmp().
> Other option would be to use glob() but even that is IMHO too much.
> And this searching should be in setup() right? (does not change
> during test run,
> why to do it more than once when run test with -i, e.g. -i3.
OK, will fix.

> 
> > +		tst_res(TINFO | TTERRNO, "regcomp");
> > +
> > +	while ((entry = readdir(dir)) != NULL) {
> > +		if (regexec(&regex, entry->d_name, 0, NULL, 0) ==
> > 0)
> > +			tz_counter++;
> > +	}
> > +	SAFE_CLOSEDIR(dir);
> > +	regfree(&regex);
> > +	tst_res(TDEBUG, "Found %d thermal zone(s)", tz_counter);
> > +
> > +	bool x86_pkg_temp_tz[tz_counter], x86_pkg_temp_tz_found =
> > 0;
> > +
> > +	memset(x86_pkg_temp_tz, 0, sizeof(x86_pkg_temp_tz));
> > +
> > +	for (uint8_t i = 0; i < tz_counter; i++) {
> > +		char path[PATH_LEN];
> > +
> > +		snprintf(path, PATH_LEN,
> > "/sys/class/thermal/thermal_zone%d/type", i);
> > +		FILE *fp = SAFE_FOPEN(path, "r");
> You print too many TDEBUG. Why don't you print opened
> /sys/class/thermal/thermal_zone%d/type file?
In case of failure, I want the tester to be able to find the issue
without modifying the test code. Here I chose not to print it, since
this test only touches x86_pkg_temp-type zones, but following your
suggestion I will change it.


> > +
> > +		if (fgets(line, sizeof(line), fp) && strstr(line,
> > "x86_pkg_temp")) {
> Please use SAFE_FILE_SCANF() or FILE_SCANF()
> https://github.com/linux-test-project/ltp/blob/master/doc/old/C-Test-API.asciidoc#14-safe-macros
OK, will fix.

> 
> Kind regards,
> Petr
> 
> > +			tst_res(TDEBUG, "Thermal zone %d uses
> > x86_pkg_temp", i);
> > +			x86_pkg_temp_tz[i] = 1;
> > +			x86_pkg_temp_tz_found = 1;
> > +		}
> > +		SAFE_FCLOSE(fp);
> > +	}
> > +	if (!x86_pkg_temp_tz_found) {
> > +		tst_res(TINFO, "No thermal zone uses
> > x86_pkg_temp");
> > +		status = 0;
> > +	}
> ...
---------------------------------------------------------------------
Intel Technology Poland sp. z o.o.
ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | Kapital zakladowy 200.000 PLN.
Spolka oswiadcza, ze posiada status duzego przedsiebiorcy w rozumieniu ustawy z dnia 8 marca 2013 r. o przeciwdzialaniu nadmiernym opoznieniom w transakcjach handlowych.

Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i moze zawierac informacje poufne. W razie przypadkowego otrzymania tej wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione.
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [LTP] [PATCH v2] thermal: add new test group
  2026-01-21 11:55   ` Kubaj, Piotr
@ 2026-01-21 23:06     ` Petr Vorel
  2026-01-22 14:27     ` Petr Vorel
  1 sibling, 0 replies; 10+ messages in thread
From: Petr Vorel @ 2026-01-21 23:06 UTC (permalink / raw)
  To: Kubaj, Piotr
  Cc: Wysocki, Rafael J, Ossowski, Tomasz, Dubel, Helena Anna,
	Niestepski, Daniel, ltp@lists.linux.it

Hi Piotr,

> > I tried to run test under root:

> > # ./thermal_interrupt_events
> > tst_test.c:1856: TINFO: Overall timeout per run is 0h 03m 30s
> > thermal_interrupt_events.c:168: TBROK: Failed to close FILE
> > '/sys/class/thermal/thermal_zone1/trip_point_1_temp': EINVAL (22)

> > But later it worked:
> > tst_test.c:2028: TINFO: LTP version: 20250930-134-g02805b05a1
> > tst_test.c:2031: TINFO: Tested kernel: 6.17.12+deb14-amd64 #1 SMP
> > PREEMPT_DYNAMIC Debian 6.17.12-1 (2025-12-14) x86_64
> > tst_kconfig.c:88: TINFO: Parsing kernel config '/boot/config-
> > 6.17.12+deb14-amd64'
> > tst_test.c:1856: TINFO: Overall timeout per run is 0h 03m 30s
> > thermal_interrupt_events.c:181: TPASS: x86 package thermal interrupt
> > triggered

> > I wonder what was wrong.
> Can you check if the test fails again the 1st time after a reboot? If
> I'm correct, it might be a reproduction of the bug due to be fixed in
> https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git/patch/?id=39b1bd1613b8f73994f654988ad75a72b633f5e2

Yes, it's really affected only 1st run after reboot. Thanks for pointing out
the fix.

In that case once fix is merged to Linus' tree (so that the git commit hash will
not change) we should add it to the test [1]:

struct tst_test test = {
	...
	.tags = (const struct tst_tag[]) {
			{"linux-git", "39b1bd1613b8f"},
			{}

This info will be printed on the test failure. And also the fix will be in our
doc [2].

(The fix is not yet in the next tree, because thermal-fixes branch is not
configured for linux-next git, although other linux-pm git branches are
configured [3]).

Kind regards,
Petr

[1] https://github.com/linux-test-project/ltp/blob/master/doc/old/C-Test-API.asciidoc#140-test-tags
[2] https://linux-test-project.readthedocs.io/en/latest/users/test_catalog.html
[3] https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/tree/Next/Trees?h=next-20260121

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [LTP] [PATCH v2] thermal: add new test group
  2026-01-21 11:55   ` Kubaj, Piotr
  2026-01-21 23:06     ` Petr Vorel
@ 2026-01-22 14:27     ` Petr Vorel
  2026-01-23 12:37       ` Kubaj, Piotr
  1 sibling, 1 reply; 10+ messages in thread
From: Petr Vorel @ 2026-01-22 14:27 UTC (permalink / raw)
  To: Kubaj, Piotr
  Cc: Wysocki, Rafael J, Ossowski, Tomasz, Dubel, Helena Anna,
	Niestepski, Daniel, ltp@lists.linux.it

Hi Piotr,
...
> > > +	bool interrupts_found = 0;
> > > +	char line[8192];
> > very nit: IMHO 1024 would be more than enough, but whatever.
> And I wasn't even sure 8192 would be enough. The reason is that, since
> it's a string, every digit is a single array element. With new 2S or 4S
> systems with hundreds of cores and each interrupt being up to 2^64,
> even 8192 might not be enough.

OK.

> > > +
> > > +	memset(interrupt_array, 0, nproc *
> > > sizeof(*interrupt_array));
> > > +	FILE *fp = SAFE_FOPEN("/proc/interrupts", "r");
> > > +
> > > +	while (fgets(line, sizeof(line), fp)) {
> > > +		if (strstr(line, "Thermal event interrupts")) {
> > Can't we use FILE_LINES_SCANF() or SAFE_FILE_LINES_SCANF() to instead
> > of whole
> > while() block to simplify?

> > See example code
> > https://github.com/linux-test-project/ltp/tree/master/lib/newlib_tests/tst_safe_fileops.c
> It's quite unclear to me. SAFE_FILE_LINES_SCANF() seems fine for
> reading a single interrupt number or even multiple, but only when well
> known how many cores we have. Here the number of elements in the array
> is equal to the number of logical cores the system has, in my case
> it's:
>  TRM:       7795       7795       7795       7795       7800       7800
> 7797       7797       7795       7795       7886       7886       7860
> 7860       7863       7863       7795       7795       7795       7795
> 7795       7795       7795       7795   Thermal event interrupts

> I tried:
> SAFE_FILE_LINES_SCANF("/proc/interrupts", " TRM:%sThermal event
> interrupts", line);

> to fit all the numbers in "line" string and then later parse them, but
> only the 1st number is read. Here we need to have all of them.

I'm sorry, I was wrong here. Yes, you right SAFE_FILE_LINES_SCANF() scans whole
file at once. With generic pattern it can cumulate the results (otherwise with
specific enough it finds only single place). Anyway, not suitable for you.

But you could process each line with SAFE_SSCANF(), that would help to avoid
strtok() (simplify code a lot).

Kind regards,
Petr

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [LTP] [PATCH v2] thermal: add new test group
  2026-01-22 14:27     ` Petr Vorel
@ 2026-01-23 12:37       ` Kubaj, Piotr
  2026-01-23 19:48         ` Petr Vorel
  0 siblings, 1 reply; 10+ messages in thread
From: Kubaj, Piotr @ 2026-01-23 12:37 UTC (permalink / raw)
  To: pvorel@suse.cz
  Cc: Wysocki, Rafael J, Ossowski, Tomasz, Dubel, Helena Anna,
	Niestepski, Daniel, ltp@lists.linux.it

2026-01-22 (木) の 15:27 +0100 に Petr Vorel さんは書きました:
> Hi Piotr,
> ...
> > > > +	bool interrupts_found = 0;
> > > > +	char line[8192];
> > > very nit: IMHO 1024 would be more than enough, but whatever.
> > And I wasn't even sure 8192 would be enough. The reason is that,
> > since
> > it's a string, every digit is a single array element. With new 2S
> > or 4S
> > systems with hundreds of cores and each interrupt being up to 2^64,
> > even 8192 might not be enough.
> 
> OK.
> 
> > > > +
> > > > +	memset(interrupt_array, 0, nproc *
> > > > sizeof(*interrupt_array));
> > > > +	FILE *fp = SAFE_FOPEN("/proc/interrupts", "r");
> > > > +
> > > > +	while (fgets(line, sizeof(line), fp)) {
> > > > +		if (strstr(line, "Thermal event interrupts"))
> > > > {
> > > Can't we use FILE_LINES_SCANF() or SAFE_FILE_LINES_SCANF() to
> > > instead
> > > of whole
> > > while() block to simplify?
> 
> > > See example code
> > > https://github.com/linux-test-project/ltp/tree/master/lib/newlib_tests/tst_safe_fileops.c
> > It's quite unclear to me. SAFE_FILE_LINES_SCANF() seems fine for
> > reading a single interrupt number or even multiple, but only when
> > well
> > known how many cores we have. Here the number of elements in the
> > array
> > is equal to the number of logical cores the system has, in my case
> > it's:
> >  TRM:       7795       7795       7795       7795       7800      
> > 7800
> > 7797       7797       7795       7795       7886       7886      
> > 7860
> > 7860       7863       7863       7795       7795       7795      
> > 7795
> > 7795       7795       7795       7795   Thermal event interrupts
> 
> > I tried:
> > SAFE_FILE_LINES_SCANF("/proc/interrupts", " TRM:%sThermal event
> > interrupts", line);
> 
> > to fit all the numbers in "line" string and then later parse them,
> > but
> > only the 1st number is read. Here we need to have all of them.
> 
> I'm sorry, I was wrong here. Yes, you right SAFE_FILE_LINES_SCANF()
> scans whole
> file at once. With generic pattern it can cumulate the results
> (otherwise with
> specific enough it finds only single place). Anyway, not suitable for
> you.
> 
> But you could process each line with SAFE_SSCANF(), that would help
> to avoid
> strtok() (simplify code a lot).
> 
> Kind regards,
> Petr


Hi,

I tried:
SAFE_SSCANF(line, " TRM:%sThermal event interrupts", buffer);

But it's the same as before, only the first number ends up in the
buffer. Still, even if I managed to put them all into buffer, I would
still need to later divide them into individual elements of
interrupt_array and strtok seems fit for that.
---------------------------------------------------------------------
Intel Technology Poland sp. z o.o.
ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | Kapital zakladowy 200.000 PLN.
Spolka oswiadcza, ze posiada status duzego przedsiebiorcy w rozumieniu ustawy z dnia 8 marca 2013 r. o przeciwdzialaniu nadmiernym opoznieniom w transakcjach handlowych.

Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i moze zawierac informacje poufne. W razie przypadkowego otrzymania tej wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione.
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [LTP] [PATCH v2] thermal: add new test group
  2026-01-23 12:37       ` Kubaj, Piotr
@ 2026-01-23 19:48         ` Petr Vorel
  0 siblings, 0 replies; 10+ messages in thread
From: Petr Vorel @ 2026-01-23 19:48 UTC (permalink / raw)
  To: Kubaj, Piotr
  Cc: Wysocki, Rafael J, Ossowski, Tomasz, Dubel, Helena Anna,
	Niestepski, Daniel, ltp@lists.linux.it

Hi Piotr,

...
> Hi,

> I tried:
> SAFE_SSCANF(line, " TRM:%sThermal event interrupts", buffer);

I'm sorry, you wrote that, but I did not get that the line is based on number of
CPU core (I meant scanning into integer variables).

> But it's the same as before, only the first number ends up in the
> buffer. Still, even if I managed to put them all into buffer, I would
> still need to later divide them into individual elements of
> interrupt_array and strtok seems fit for that.

I'm usually trying to avoid using strtok(), but whatever.

Kind regards,
Petr

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2026-01-23 19:48 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-11-14 18:01 [LTP] [PATCH v2] thermal: add new test group Piotr Kubaj
2025-11-18 18:18 ` Cyril Hrubis
2025-11-19  9:35   ` Cyril Hrubis
  -- strict thread matches above, loose matches on Subject: below --
2026-01-20 14:46 Piotr Kubaj
2026-01-20 19:38 ` Petr Vorel
2026-01-21 11:55   ` Kubaj, Piotr
2026-01-21 23:06     ` Petr Vorel
2026-01-22 14:27     ` Petr Vorel
2026-01-23 12:37       ` Kubaj, Piotr
2026-01-23 19:48         ` Petr Vorel

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox