[LTP] [PATCH v6] power_management: rewrite runpwtests04.sh in C
Cyril Hrubis
chrubis@suse.cz
Fri Jul 10 16:20:24 CEST 2026
> runtest/power_management_tests | 2 +-
> testcases/kernel/power_management/.gitignore | 1 +
> testcases/kernel/power_management/cpuidle01.c | 90 +++++++++++++++++++
> .../kernel/power_management/runpwtests04.sh | 58 ------------
> 4 files changed, 92 insertions(+), 59 deletions(-)
> create mode 100644 testcases/kernel/power_management/cpuidle01.c
> delete mode 100755 testcases/kernel/power_management/runpwtests04.sh
>
> diff --git a/runtest/power_management_tests b/runtest/power_management_tests
> index 4da57ee72..0f2656b52 100644
> --- a/runtest/power_management_tests
> +++ b/runtest/power_management_tests
> @@ -1,5 +1,5 @@
> #POWER_MANAGEMENT
> high_freq_hwp_cap_cppc high_freq_hwp_cap_cppc
> +cpuidle01 cpuidle01
> runpwtests03 runpwtests03.sh
> -runpwtests04 runpwtests04.sh
> runpwtests06 runpwtests06.sh
> diff --git a/testcases/kernel/power_management/.gitignore b/testcases/kernel/power_management/.gitignore
> index 03f0c83e4..e237df1c8 100644
> --- a/testcases/kernel/power_management/.gitignore
> +++ b/testcases/kernel/power_management/.gitignore
> @@ -1 +1,2 @@
> high_freq_hwp_cap_cppc
> +cpuidle01
> diff --git a/testcases/kernel/power_management/cpuidle01.c b/testcases/kernel/power_management/cpuidle01.c
> new file mode 100644
> index 000000000..919dd2b7c
> --- /dev/null
> +++ b/testcases/kernel/power_management/cpuidle01.c
> @@ -0,0 +1,90 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Copyright (C) 2026 Jinseok Kim <always.starving0@gmail.com>
> + */
> +
> +/*\
> + * Basic cpuidle sysfs smoke test.
> + *
> + * Verify that selected cpuidle sysfs files are readable.
> + */
> +
> +#include <fcntl.h>
> +#include <unistd.h>
> +
> +#include "tst_test.h"
> +
> +#define CPUIDLE_PATH "/sys/devices/system/cpu/cpuidle"
> +
> +static struct tcase {
> + const char *name;
> + bool is_writable;
> +} tcases[] = {
> + { "available_governors", false },
> + { "current_driver", false },
> + { "current_governor", true },
> + { "current_governor_ro", false },
> +};
> +
> +static int fd = -1;
> +
> +static void verify_cpuidle(unsigned int i)
> +{
> + int ret;
> + char path[PATH_MAX];
> + char buf[32];
> +
> + snprintf(path, sizeof(path), "%s/%s", CPUIDLE_PATH, tcases[i].name);
> +
> + if (tcases[i].is_writable)
> + fd = open(path, O_RDWR);
> + else
> + fd = open(path, O_RDONLY);
> +
> + if (fd < 0) {
> + if (errno == ENOENT)
> + tst_res(TCONF, "%s not available", path);
> + else
> + tst_res(TFAIL | TERRNO, "open(%s) failed", path);
> + return;
> + }
> +
> + ret = read(fd, buf, sizeof(buf));
> +
> + if (ret < 0)
> + tst_res(TFAIL | TERRNO, "%s read() failed", path);
> + else if (ret == 0)
> + tst_res(TFAIL, "%s read() returned 0", path);
> + else
> + tst_res(TPASS, "%s read() successfully", path);
When we actually bother writing tests maybe we should not do it with the
array style, but rather add a function per sysfs file that would
actually check that the data are correct.
E.g. we could write a function that would read and parse
available_governors and then check that current_governor is in the set
of the available_governors.
> + if (tcases[i].is_writable) {
> + if (write(fd, "invalid_governor", 16) < 0) {
> + if (errno == EINVAL)
> + tst_res(TPASS, "%s rejected invalid input with EINVAL", path);
> + else
> + tst_res(TFAIL | TERRNO, "%s rejected invalid input with unexpected errno", path);
> + } else {
> + tst_res(TFAIL, "%s accepted invalid input successfully", path);
> + }
This can be just TST_EXP_FAIL2();
> + }
> +
> + SAFE_CLOSE(fd);
> +}
> +
> +static void cleanup(void)
> +{
> + if (fd != -1)
> + SAFE_CLOSE(fd);
> +}
> +
> +static struct tst_test test = {
> + .cleanup = cleanup,
> + .needs_root = 1,
> + .tcnt = ARRAY_SIZE(tcases),
> + .test = verify_cpuidle,
> + .save_restore = (const struct tst_path_val[]) {
> + { CPUIDLE_PATH "/current_governor", NULL, TST_SR_TCONF },
> + {}
> + },
> +};
> diff --git a/testcases/kernel/power_management/runpwtests04.sh b/testcases/kernel/power_management/runpwtests04.sh
> deleted file mode 100755
> index 6565320d2..000000000
> --- a/testcases/kernel/power_management/runpwtests04.sh
> +++ /dev/null
> @@ -1,58 +0,0 @@
> -#! /bin/sh
> -#
> -# Copyright (c) International Business Machines Corp., 2001
> -# Author: Nageswara R Sastry <nasastry@in.ibm.com>
> -#
> -# This program is free software; you can redistribute it and#or modify
> -# it under the terms of the GNU General Public License as published by
> -# the Free Software Foundation; either version 2 of the License, or
> -# (at your option) any later version.
> -#
> -# This program is distributed in the hope that it will be useful, but
> -# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
> -# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
> -# for more details.
> -#
> -# You should have received a copy of the GNU General Public License
> -# along with this program; if not, write to the Free Software Foundation,
> -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
> -#
> -
> -export TCID="Power_Management04"
> -export TST_TOTAL=1
> -
> -. test.sh
> -. pm_include.sh
> -
> -check_cpuidle_sysfs_files() {
> - RC=0
> - if [ -d /sys/devices/system/cpu/cpuidle ] ; then
> - for files in current_governor_ro current_driver
> - do
> - cat /sys/devices/system/cpu/cpuidle/${files} \
> - >/dev/null 2>&1
> - if [ $? -ne 0 ] ; then
> - echo "${0}: FAIL: cat ${files}"
> - RC=1
> - fi
> - done
> - fi
> - if [ ${RC} -eq 0 ] ; then
> - echo "${0}: PASS: Checking cpu idle sysfs files"
> - else
> - echo "${0}: FAIL: Checking cpu idle sysfs files"
> - fi
> - return $RC
> -}
> -
> -# Checking test environment
> -check_arch
> -
> -# Checking cpuidle sysfs interface files
> -if check_cpuidle_sysfs_files ; then
> - tst_resm TPASS "CPUIDLE sysfs tests passed"
> -else
> - tst_resm TFAIL "CPUIDLE sysfs tests failed"
> -fi
> -
> -tst_exit
> --
> 2.43.0
>
> --
> Mailing list info: https://lists.linux.it/listinfo/ltp
--
Cyril Hrubis
chrubis@suse.cz
More information about the ltp
mailing list