* [LTP] [PATCH v8] power_management: rewrite runpwtests04.sh in C
@ 2026-08-05 14:52 Jinseok Kim
2026-08-05 15:46 ` Petr Vorel
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Jinseok Kim @ 2026-08-05 14:52 UTC (permalink / raw)
To: ltp
Rewrite the cpuidle sysfs smoke test using the LTP C API.
Keep the existing readability checks for current_governor_ro and
current_driver, and extend the coverage to available_governors and
current_governor. Also verify that writing an invalid governor to
current_governor is rejected with EINVAL.
Signed-off-by: Jinseok Kim <always.starving0@gmail.com>
---
Changes in v8:
- Reword the commit message to describe the extended test coverage.
- Remove unnecessary save/restore for current_governor.
- Sort and anchor .gitignore entries.
- Link to v7: https://lore.kernel.org/ltp/20260729112916.4958-1-always.starving0@gmail.com
Changes in v7:
- Replace the array-based test with dedicated helper functions.
- Use TST_EXP_FAIL2() for the invalid governor test.
- Clarify the test description.
- Link to v6: https://lore.kernel.org/ltp/20260707150920.6489-1-always.starving0@gmail.com
Changes in v6:
- Expand test coverage to include 4 core cpuidle sysfs ABIs.
- Add verification of read() system call return values (bytes read).
- Add negative testing for 'current_governor' to verify EINVAL return value.
- Replace manual access() check with LTP .save_restore.
- Link to v5: https://lore.kernel.org/ltp/20260612171415.988-1-always.starving0@gmail.com
Changes in v5:
- Remove runpwtests04.sh
- Link to v4: https://lore.kernel.org/ltp/20260612122045.14962-1-always.starving0@gmail.com
Changes in v4:
- Fix patch application failure reported by CI.
- Link to v3: https://lore.kernel.org/ltp/20260611145911.3752-1-always.starving0@gmail.com
Changes in v3:
- Replace SAFE_OPEN() with open() to convert ENOENT to TCONF.
- Add a cleanup function.
- Link to v2: https://lore.kernel.org/ltp/20260524154221.2064-1-always.starving0@gmail.com
Changes in v2:
- Update runtest entry
- Clarify commit message
- Link to v1: https://lore.kernel.org/ltp/20260516200015.12689-1-always.starving0@gmail.com
---
runtest/power_management_tests | 2 +-
testcases/kernel/power_management/.gitignore | 3 +-
testcases/kernel/power_management/cpuidle01.c | 102 ++++++++++++++++++
.../kernel/power_management/runpwtests04.sh | 58 ----------
4 files changed, 105 insertions(+), 60 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..052696dc5 100644
--- a/testcases/kernel/power_management/.gitignore
+++ b/testcases/kernel/power_management/.gitignore
@@ -1 +1,2 @@
-high_freq_hwp_cap_cppc
+/cpuidle01
+/high_freq_hwp_cap_cppc
diff --git a/testcases/kernel/power_management/cpuidle01.c b/testcases/kernel/power_management/cpuidle01.c
new file mode 100644
index 000000000..7e7b8d01f
--- /dev/null
+++ b/testcases/kernel/power_management/cpuidle01.c
@@ -0,0 +1,102 @@
+// 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 and contain
+ * non-empty values. Also verify that current_governor rejects an
+ * invalid governor.
+ *
+ * Root privileges are required to write to current_governor.
+ */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "tst_test.h"
+
+#define CPUIDLE_PATH "/sys/devices/system/cpu/cpuidle"
+#define AVAILABLE_GOVERNORS CPUIDLE_PATH "/available_governors"
+#define CURRENT_DRIVER CPUIDLE_PATH "/current_driver"
+#define CURRENT_GOVERNOR CPUIDLE_PATH "/current_governor"
+#define CURRENT_GOVERNOR_RO CPUIDLE_PATH "/current_governor_ro"
+
+static void verify_readable(const char *path)
+{
+ int ret;
+ char buf[32];
+
+ int fd = open(path, O_RDONLY);
+
+ if (fd < 0) {
+ if (errno == ENOENT)
+ tst_res(TCONF, "%s is 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);
+
+ SAFE_CLOSE(fd);
+}
+
+static void check_available_governors(void)
+{
+ verify_readable(AVAILABLE_GOVERNORS);
+}
+
+static void check_current_driver(void)
+{
+ verify_readable(CURRENT_DRIVER);
+}
+
+static void check_current_governor_ro(void)
+{
+ verify_readable(CURRENT_GOVERNOR_RO);
+}
+
+static void check_current_governor(void)
+{
+ int fd;
+
+ verify_readable(CURRENT_GOVERNOR);
+
+ fd = open(CURRENT_GOVERNOR, O_WRONLY);
+
+ if (fd < 0) {
+ if (errno == ENOENT)
+ tst_res(TCONF, "%s is not available", CURRENT_GOVERNOR);
+ else
+ tst_res(TFAIL | TERRNO, "open(%s) failed", CURRENT_GOVERNOR);
+ return;
+ }
+
+ TST_EXP_FAIL2(write(fd, "invalid_governor", 16), EINVAL);
+
+ SAFE_CLOSE(fd);
+}
+
+static void run(void)
+{
+ check_available_governors();
+ check_current_driver();
+ check_current_governor();
+ check_current_governor_ro();
+}
+
+static struct tst_test test = {
+ .test_all = run,
+ .needs_root = 1,
+};
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
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [LTP] [PATCH v8] power_management: rewrite runpwtests04.sh in C
2026-08-05 14:52 [LTP] [PATCH v8] power_management: rewrite runpwtests04.sh in C Jinseok Kim
@ 2026-08-05 15:46 ` Petr Vorel
2026-08-05 15:48 ` Petr Vorel
[not found] ` <20260805154727.GB649402@pevik>
2 siblings, 0 replies; 4+ messages in thread
From: Petr Vorel @ 2026-08-05 15:46 UTC (permalink / raw)
To: Jinseok Kim; +Cc: ltp
Hi Jinseok Kim,
Patch does not apply:
error: patch failed: runtest/power_management_tests:1
error: runtest/power_management_tests: patch does not apply
error: patch failed: testcases/kernel/power_management/.gitignore:1
error: testcases/kernel/power_management/.gitignore: patch does not apply
Patch failed at 0001 power_management: rewrite runpwtests04.sh in C
=> please rebase and repost.
> runpwtests06 runpwtests06.sh
> diff --git a/testcases/kernel/power_management/.gitignore b/testcases/kernel/power_management/.gitignore
> index 03f0c83e4..052696dc5 100644
> --- a/testcases/kernel/power_management/.gitignore
> +++ b/testcases/kernel/power_management/.gitignore
> @@ -1 +1,2 @@
> -high_freq_hwp_cap_cppc
> +/cpuidle01
> +/high_freq_hwp_cap_cppc
> diff --git a/testcases/kernel/power_management/cpuidle01.c b/testcases/kernel/power_management/cpuidle01.c
> new file mode 100644
> index 000000000..7e7b8d01f
> --- /dev/null
> +++ b/testcases/kernel/power_management/cpuidle01.c
> @@ -0,0 +1,102 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Copyright (C) 2026 Jinseok Kim <always.starving0@gmail.com>
Maybe add a note:
Based on a script written by Nageswara R Sastry <nasastry@in.ibm.com>
Copyright (c) International Business Machines Corp., 2001
Kind regards,
Petr
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [LTP] [PATCH v8] power_management: rewrite runpwtests04.sh in C
2026-08-05 14:52 [LTP] [PATCH v8] power_management: rewrite runpwtests04.sh in C Jinseok Kim
2026-08-05 15:46 ` Petr Vorel
@ 2026-08-05 15:48 ` Petr Vorel
[not found] ` <20260805154727.GB649402@pevik>
2 siblings, 0 replies; 4+ messages in thread
From: Petr Vorel @ 2026-08-05 15:48 UTC (permalink / raw)
To: Jinseok Kim; +Cc: ltp
Hi Jinseok Kim,
> +static void run(void)
> +{
> + check_available_governors();
> + check_current_driver();
> + check_current_governor();
> + check_current_governor_ro();
please instead of this and .test_all use a test struct, the way we use in
basically any test, see e.g.
testcases/kernel/syscalls/mbind/mbind01.c
testcases/kernel/syscalls/bind/bind01.c
then you'll use:
.tcnt = ARRAY_SIZE(tcase),
.test = do_test
Kind regards,
Petr
> +}
> +
> +static struct tst_test test = {
> + .test_all = run,
> + .needs_root = 1,
> +};
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [LTP] [PATCH v8] power_management: rewrite runpwtests04.sh in C
[not found] ` <20260805154727.GB649402@pevik>
@ 2026-08-06 8:36 ` Jan Stancek via ltp
0 siblings, 0 replies; 4+ messages in thread
From: Jan Stancek via ltp @ 2026-08-06 8:36 UTC (permalink / raw)
To: Petr Vorel, LTP List
On Wed, Aug 5, 2026 at 5:48 PM Petr Vorel <pvorel@suse.cz> wrote:
>
> Hi Jinseok Kim,
>
> [Cc Jan ]
CC mailing list
>
> > +/*\
> > + * Basic cpuidle sysfs smoke test.
> > + *
> > + * Verify that selected cpuidle sysfs files are readable and contain
> > + * non-empty values. Also verify that current_governor rejects an
> > + * invalid governor.
> > + *
> > + * Root privileges are required to write to current_governor.
> > + */
> > +
> > +#include <errno.h>
> > +#include <fcntl.h>
> > +#include <unistd.h>
> > +
> > +#include "tst_test.h"
> > +
> > +#define CPUIDLE_PATH "/sys/devices/system/cpu/cpuidle"
> > +#define AVAILABLE_GOVERNORS CPUIDLE_PATH "/available_governors"
> > +#define CURRENT_DRIVER CPUIDLE_PATH "/current_driver"
> > +#define CURRENT_GOVERNOR CPUIDLE_PATH "/current_governor"
> > +#define CURRENT_GOVERNOR_RO CPUIDLE_PATH "/current_governor_ro"
> > +
> > +static void verify_readable(const char *path)
> > +{
> > + int ret;
> > + char buf[32];
> > +
> > + int fd = open(path, O_RDONLY);
> > +
> > + if (fd < 0) {
> > + if (errno == ENOENT)
> > + tst_res(TCONF, "%s is not available", path);
> While this works, we have .save_restore, you would use it with TST_SR_TCONF_MISSING
> https://linux-test-project.readthedocs.io/en/latest/developers/api_c_tests.html#saving-and-restoring-proc-sys-values
>
> But because that would skip whole testing if one of them is missing, maybe
> instead each test function should check with tst_sys_conf_save().
>
> @Jan Or something else would be more appropriate than lib/tst_sys_conf.c to just
> detect path existence?
tst_path_exists() + FILE_SCANF() perhaps, and you report again errors
from FILE_SCANF() as TFAIL
>
> Kind regards,
> Petr
>
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-08-06 8:37 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-05 14:52 [LTP] [PATCH v8] power_management: rewrite runpwtests04.sh in C Jinseok Kim
2026-08-05 15:46 ` Petr Vorel
2026-08-05 15:48 ` Petr Vorel
[not found] ` <20260805154727.GB649402@pevik>
2026-08-06 8:36 ` Jan Stancek via ltp
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox