public inbox for ltp@lists.linux.it
 help / color / mirror / Atom feed
* [LTP] [PATCH] thermal: add new test group
@ 2025-11-06 11:43 Piotr Kubaj
  2025-11-06 12:46 ` Cyril Hrubis
  2025-11-10 10:31 ` Cyril Hrubis
  0 siblings, 2 replies; 7+ messages in thread
From: Piotr Kubaj @ 2025-11-06 11:43 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.

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 | 92 +++++++++++++++++++++++++++
 5 files changed, 107 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..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.
+###############################################################################
+
+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."
+	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
+	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
+			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
-- 
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] 7+ messages in thread

* Re: [LTP] [PATCH] thermal: add new test group
  2025-11-06 11:43 [LTP] [PATCH] thermal: add new test group Piotr Kubaj
@ 2025-11-06 12:46 ` Cyril Hrubis
  2025-11-06 16:50   ` Petr Vorel
  2025-11-10 10:31 ` Cyril Hrubis
  1 sibling, 1 reply; 7+ messages in thread
From: Cyril Hrubis @ 2025-11-06 12:46 UTC (permalink / raw)
  To: Piotr Kubaj
  Cc: daniel.niestepski, tomasz.ossowski, helena.anna.dubel,
	rafael.j.wysocki, ltp

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

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

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

* Re: [LTP] [PATCH] thermal: add new test group
  2025-11-06 12:46 ` Cyril Hrubis
@ 2025-11-06 16:50   ` Petr Vorel
  2025-11-10 10:33     ` Cyril Hrubis
  0 siblings, 1 reply; 7+ messages in thread
From: Petr Vorel @ 2025-11-06 16:50 UTC (permalink / raw)
  To: Cyril Hrubis
  Cc: helena.anna.dubel, tomasz.ossowski, rafael.j.wysocki, Piotr Kubaj,
	daniel.niestepski, ltp

Hi Piotr, Cyril,

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

Piotr, first thank you for submitting a test.

My wish would be no more shell based test. shell loader is kind of compromise to
improve existing shell based tests, but I'm not happy to see yet new more tests
in shell (we in SUSE will be then actively rewriting it into C :( to avoid
various problems with shell tests).

Piotr, would it be so hard to rewrite it into decent C?

C API has many helpers and it's more reliable:

https://github.com/linux-test-project/ltp/blob/master/doc/old/C-Test-API.asciidoc
https://linux-test-project.readthedocs.io/en/latest/developers/api_c_tests.html
https://linux-test-project.readthedocs.io/en/latest/developers/test_case_tutorial.html

+ many tests rewritten as a real code examples (see these which include "tst_test.h").

Also, do you plan to write only a single test? If yes I'm not sure if single
test deserves it's own scenario group.

Kind regards,
Petr

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

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

* Re: [LTP] [PATCH] thermal: add new test group
  2025-11-06 11:43 [LTP] [PATCH] thermal: add new test group Piotr Kubaj
  2025-11-06 12:46 ` Cyril Hrubis
@ 2025-11-10 10:31 ` Cyril Hrubis
  1 sibling, 0 replies; 7+ messages in thread
From: Cyril Hrubis @ 2025-11-10 10:31 UTC (permalink / raw)
  To: Piotr Kubaj
  Cc: daniel.niestepski, tomasz.ossowski, helena.anna.dubel,
	rafael.j.wysocki, ltp

Hi!
FYI I've just send a patch with a basic documentation for the shell test
library, feel free to comment if there is anything unclear there:

https://patchwork.ozlabs.org/project/ltp/patch/20251110102407.15308-1-chrubis@suse.cz/

-- 
Cyril Hrubis
chrubis@suse.cz

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

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

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

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.
> 
> Piotr, first thank you for submitting a test.
> 
> My wish would be no more shell based test. shell loader is kind of compromise to
> improve existing shell based tests, but I'm not happy to see yet new more tests
> in shell (we in SUSE will be then actively rewriting it into C :( to avoid
> various problems with shell tests).

Honestly for a test that is as simple as this one shell may be fine.
Anything more complex that this should be probably written in C.

-- 
Cyril Hrubis
chrubis@suse.cz

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

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

* [LTP] [PATCH] thermal: add new test group
@ 2026-01-19  8:51 Piotr Kubaj
  2026-01-19 13:20 ` Andrea Cervesato via ltp
  0 siblings, 1 reply; 7+ messages in thread
From: Piotr Kubaj @ 2026-01-19  8:51 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.

Signed-off-by: Piotr Kubaj <piotr.kubaj@intel.com>
---
 runtest/thermal                               |   3 +
 scenario_groups/default                       |   1 +
 testcases/kernel/Makefile                     |   1 +
 testcases/kernel/thermal/Makefile             |   9 +
 .../kernel/thermal/thermal_interrupt_events.c | 188 ++++++++++++++++++
 5 files changed, 202 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..4657c3fb3
--- /dev/null
+++ b/testcases/kernel/thermal/Makefile
@@ -0,0 +1,9 @@
+# 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
+
+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..c9f283f6e
--- /dev/null
+++ b/testcases/kernel/thermal/thermal_interrupt_events.c
@@ -0,0 +1,188 @@
+// 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(!!strcmp(token, "Thermal"))
+			{
+				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 = sysconf(_SC_NPROCESSORS_ONLN);
+	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);
+			strcpy(temp_path, path);
+			strcat(temp_path, "temp");
+			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);
+
+			strcpy(trip_path, path);
+			strcat(trip_path, "trip_point_1_temp");
+
+			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, 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, 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] 7+ messages in thread

* Re: [LTP] [PATCH] thermal: add new test group
  2026-01-19  8:51 Piotr Kubaj
@ 2026-01-19 13:20 ` Andrea Cervesato via ltp
  0 siblings, 0 replies; 7+ messages in thread
From: Andrea Cervesato via ltp @ 2026-01-19 13:20 UTC (permalink / raw)
  To: Piotr Kubaj, ltp
  Cc: tomasz.ossowski, helena.anna.dubel, rafael.j.wysocki,
	daniel.niestepski

Hi!

There are a few issues with this code. We need to clean it up
before proceeding with the proper review. In LTP we have a strict policy
when it comes to writing new tests and that can be read in the following
links:

https://linux-test-project.readthedocs.io/en/latest/developers/ground_rules.html
https://linux-test-project.readthedocs.io/en/latest/developers/writing_tests.html
https://linux-test-project.readthedocs.io/en/latest/developers/test_case_tutorial.html

Documentation is away from being perfect, but it needs to be read before
proceeding, since some technical aspects are covered only in there and
inside some of our reviews, especially the ones from maintainers with
the highest expertise (@Cyril, @Petr and @Li in particular).

A few points below:

* run `make check` locally inside the test folder and verify errors
  inside the test code

* run github CI by pushing your commits inside a forked LTP project.
  The patch is not passing in any of our tested platforms (I'm sorry if
  CI report is not working in patchwork yet, but that has been fixed
  today)

* please verify that all you need has not been implemented inside the
  LTP library already. For instance, we already have `tst_ncpus()` and
  _SC_NPROCESSORS_ONLN is not needed

* please avoid as much as possible unsafe memory operations over strings.
  we dont really want to use strcpy(), strcat(), etc. In most of the
  cases, snprint() and asprintf() are the right choice

* why using regexp for something as easy as finding a substring inside a
  string, without any particular substring rule over data?

In general, we need to create a code that is working as good as possible,
since debugging test failures can be really complex inside kernel. Test
has to provide very little friction with the kernel in order to reduce
test maintenance.

Let's start from this, we will continue the review when these points are
first achieved.

Kind regards,

-- 
Andrea Cervesato
SUSE QE Automation Engineer Linux
andrea.cervesato@suse.com


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

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

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

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-11-06 11:43 [LTP] [PATCH] thermal: add new test group Piotr Kubaj
2025-11-06 12:46 ` Cyril Hrubis
2025-11-06 16:50   ` Petr Vorel
2025-11-10 10:33     ` Cyril Hrubis
2025-11-10 10:31 ` Cyril Hrubis
  -- strict thread matches above, loose matches on Subject: below --
2026-01-19  8:51 Piotr Kubaj
2026-01-19 13:20 ` Andrea Cervesato via ltp

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