* [LTP] [PATCH] controllers/cpuacct: Dynamically adjust cpuacct_task execution time
@ 2026-08-10 4:17 Wake Liu via ltp
2026-08-10 5:28 ` [LTP] " linuxtestproject.agent
2026-08-10 8:30 ` [LTP] [PATCH] " Wake Liu via ltp
0 siblings, 2 replies; 5+ messages in thread
From: Wake Liu via ltp @ 2026-08-10 4:17 UTC (permalink / raw)
To: ltp; +Cc: Wake Liu
The test helper cpuacct_task currently runs for 10ms (virtual time)
before exiting. On some systems (e.g. fast virtual machines or under
heavy load), this short duration can lead to 0 usage being recorded in
cpuacct.usage cgroup file due to timing resolution or scheduling delay,
especially when running small configurations like cpuacct_1_1.
However, unconditionally increasing the duration for all runs (e.g. to
100ms) would cause large stress tests like cpuacct_100_100 (which runs
10,000 tasks) to timeout on systems with few CPUs.
Resolve this by:
1. Modifying cpuacct_task to accept an optional duration argument.
2. Modifying cpuacct.sh to calculate the duration dynamically based on
nbprocess, ensuring each subgroup gets at least 100ms of aggregate
CPU time, while clamping the per-process duration to a minimum of
10ms to avoid timeouts in large stress tests.
Signed-off-by: Wake Liu <wakel@google.com>
---
.../kernel/controllers/cpuacct/cpuacct.sh | 7 ++++++-
.../kernel/controllers/cpuacct/cpuacct_task.c | 20 ++++++++++++++++---
2 files changed, 23 insertions(+), 4 deletions(-)
diff --git a/testcases/kernel/controllers/cpuacct/cpuacct.sh b/testcases/kernel/controllers/cpuacct/cpuacct.sh
index 97a395cd5..efabe6cab 100755
--- a/testcases/kernel/controllers/cpuacct/cpuacct.sh
+++ b/testcases/kernel/controllers/cpuacct/cpuacct.sh
@@ -139,10 +139,15 @@ do_test()
{
tst_res TINFO "Creating $max subgroups each with $nbprocess processes"
+ local duration=$((100000 / nbprocess))
+ if [ $duration -lt 10000 ]; then
+ duration=10000
+ fi
+
# create and attach process to subgroups
for i in `seq 1 $max`; do
for j in `seq 1 $nbprocess`; do
- cpuacct_task $testpath/subgroup_$i/tasks &
+ cpuacct_task $testpath/subgroup_$i/tasks $duration &
echo $! >> task_pids
done
done
diff --git a/testcases/kernel/controllers/cpuacct/cpuacct_task.c b/testcases/kernel/controllers/cpuacct/cpuacct_task.c
index 677d6d401..caeecf064 100644
--- a/testcases/kernel/controllers/cpuacct/cpuacct_task.c
+++ b/testcases/kernel/controllers/cpuacct/cpuacct_task.c
@@ -38,12 +38,21 @@ int main(int argc, char **argv)
{
FILE *f;
struct sigaction sa;
+ int duration_us = 10000;
- if (argc != 2) {
- fprintf(stderr, "Usage: %s /cgroup/.../tasks\n", argv[0]);
+ if (argc < 2 || argc > 3) {
+ fprintf(stderr, "Usage: %s /cgroup/.../tasks [duration_us]\n", argv[0]);
return 1;
}
+ if (argc == 3) {
+ duration_us = atoi(argv[2]);
+ if (duration_us <= 0) {
+ fprintf(stderr, "Invalid duration: %s\n", argv[2]);
+ return 1;
+ }
+ }
+
f = fopen(argv[1], "a");
if (!f) {
perror("fopen failed");
@@ -62,7 +71,12 @@ int main(int argc, char **argv)
return 1;
}
- struct itimerval it = {.it_value = {.tv_sec = 0, .tv_usec = 10000}};
+ struct itimerval it = {
+ .it_value = {
+ .tv_sec = duration_us / 1000000,
+ .tv_usec = duration_us % 1000000
+ }
+ };
setitimer(ITIMER_VIRTUAL, &it, NULL);
for (;;);
--
2.55.0.654.g21b8a5bc05-goog
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply related [flat|nested] 5+ messages in thread* Re: [LTP] controllers/cpuacct: Dynamically adjust cpuacct_task execution time
2026-08-10 4:17 [LTP] [PATCH] controllers/cpuacct: Dynamically adjust cpuacct_task execution time Wake Liu via ltp
@ 2026-08-10 5:28 ` linuxtestproject.agent
2026-08-10 8:30 ` [LTP] [PATCH] " Wake Liu via ltp
1 sibling, 0 replies; 5+ messages in thread
From: linuxtestproject.agent @ 2026-08-10 5:28 UTC (permalink / raw)
To: Wake Liu; +Cc: ltp
Hi Wake,
On Mon, 10 Aug 2026, Wake Liu wrote:
> controllers/cpuacct: Dynamically adjust cpuacct_task execution time
> + local duration=$((100000 / nbprocess))
Could nbprocess be validated as a positive integer at the start of setup()?
It comes directly from the second command-line argument, while TST_POS_ARGS
checks only the argument count. With `cpuacct.sh 1 0` (or nonnumeric input),
dash treats the arithmetic error as fatal, so execution bypasses
_tst_do_cleanup() after setup has created and possibly mounted the cgroup
hierarchy, leaving those resources behind.
Verdict - Needs revision
---
Note:
The agent can sometimes produce false positives although often its
findings are genuine. If you find issues with the review, please
comment this email or ignore the suggestions.
Regards,
LTP AI Reviewer
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 5+ messages in thread
* [LTP] [PATCH] controllers/cpuacct: Dynamically adjust cpuacct_task execution time
2026-08-10 4:17 [LTP] [PATCH] controllers/cpuacct: Dynamically adjust cpuacct_task execution time Wake Liu via ltp
2026-08-10 5:28 ` [LTP] " linuxtestproject.agent
@ 2026-08-10 8:30 ` Wake Liu via ltp
2026-08-10 9:22 ` [LTP] " linuxtestproject.agent
2026-08-11 10:15 ` [LTP] [PATCH] " Andrea Cervesato via ltp
1 sibling, 2 replies; 5+ messages in thread
From: Wake Liu via ltp @ 2026-08-10 8:30 UTC (permalink / raw)
To: ltp; +Cc: Wake Liu
The test helper cpuacct_task currently runs for 10ms (virtual time)
before exiting. On some systems (e.g. fast virtual machines or under
heavy load), this short duration can lead to 0 usage being recorded in
cpuacct.usage cgroup file due to timing resolution or scheduling delay,
especially when running small configurations like cpuacct_1_1.
However, unconditionally increasing the duration for all runs (e.g. to
100ms) would cause large stress tests like cpuacct_100_100 (which runs
10,000 tasks) to timeout on systems with few CPUs.
Resolve this by:
1. Modifying cpuacct_task to accept an optional duration argument.
2. Modifying cpuacct.sh to calculate the duration dynamically based on
nbprocess, ensuring each subgroup gets at least 100ms of aggregate
CPU time, while clamping the per-process duration to a minimum of
10ms to avoid timeouts in large stress tests.
3. Validating nsubgroup and nprocess arguments in cpuacct.sh setup() to
ensure they are positive integers, avoiding division by zero or fatal
arithmetic errors in shell.
Signed-off-by: Wake Liu <wakel@google.com>
---
.../kernel/controllers/cpuacct/cpuacct.sh | 17 +++++++++++++++-
.../kernel/controllers/cpuacct/cpuacct_task.c | 20 ++++++++++++++++---
2 files changed, 33 insertions(+), 4 deletions(-)
diff --git a/testcases/kernel/controllers/cpuacct/cpuacct.sh b/testcases/kernel/controllers/cpuacct/cpuacct.sh
index 97a395cd5..deb103a30 100755
--- a/testcases/kernel/controllers/cpuacct/cpuacct.sh
+++ b/testcases/kernel/controllers/cpuacct/cpuacct.sh
@@ -84,6 +84,16 @@ check_limits()
setup()
{
+ case "$max" in
+ ""|*[!0-9]*) tst_brk TBROK "nsubgroup must be a positive integer" ;;
+ *) [ "$max" -gt 0 ] || tst_brk TBROK "nsubgroup must be a positive integer" ;;
+ esac
+
+ case "$nbprocess" in
+ ""|*[!0-9]*) tst_brk TBROK "nprocess must be a positive integer" ;;
+ *) [ "$nbprocess" -gt 0 ] || tst_brk TBROK "nprocess must be a positive integer" ;;
+ esac
+
if ! grep -q -w cpuacct /proc/cgroups; then
tst_brk TCONF "cpuacct not supported on this system"
fi
@@ -139,10 +149,15 @@ do_test()
{
tst_res TINFO "Creating $max subgroups each with $nbprocess processes"
+ local duration=$((100000 / nbprocess))
+ if [ "$duration" -lt 10000 ]; then
+ duration=10000
+ fi
+
# create and attach process to subgroups
for i in `seq 1 $max`; do
for j in `seq 1 $nbprocess`; do
- cpuacct_task $testpath/subgroup_$i/tasks &
+ cpuacct_task "$testpath/subgroup_$i/tasks" "$duration" &
echo $! >> task_pids
done
done
diff --git a/testcases/kernel/controllers/cpuacct/cpuacct_task.c b/testcases/kernel/controllers/cpuacct/cpuacct_task.c
index 677d6d401..caeecf064 100644
--- a/testcases/kernel/controllers/cpuacct/cpuacct_task.c
+++ b/testcases/kernel/controllers/cpuacct/cpuacct_task.c
@@ -38,12 +38,21 @@ int main(int argc, char **argv)
{
FILE *f;
struct sigaction sa;
+ int duration_us = 10000;
- if (argc != 2) {
- fprintf(stderr, "Usage: %s /cgroup/.../tasks\n", argv[0]);
+ if (argc < 2 || argc > 3) {
+ fprintf(stderr, "Usage: %s /cgroup/.../tasks [duration_us]\n", argv[0]);
return 1;
}
+ if (argc == 3) {
+ duration_us = atoi(argv[2]);
+ if (duration_us <= 0) {
+ fprintf(stderr, "Invalid duration: %s\n", argv[2]);
+ return 1;
+ }
+ }
+
f = fopen(argv[1], "a");
if (!f) {
perror("fopen failed");
@@ -62,7 +71,12 @@ int main(int argc, char **argv)
return 1;
}
- struct itimerval it = {.it_value = {.tv_sec = 0, .tv_usec = 10000}};
+ struct itimerval it = {
+ .it_value = {
+ .tv_sec = duration_us / 1000000,
+ .tv_usec = duration_us % 1000000
+ }
+ };
setitimer(ITIMER_VIRTUAL, &it, NULL);
for (;;);
--
2.55.0.654.g21b8a5bc05-goog
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-08-11 10:16 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-10 4:17 [LTP] [PATCH] controllers/cpuacct: Dynamically adjust cpuacct_task execution time Wake Liu via ltp
2026-08-10 5:28 ` [LTP] " linuxtestproject.agent
2026-08-10 8:30 ` [LTP] [PATCH] " Wake Liu via ltp
2026-08-10 9:22 ` [LTP] " linuxtestproject.agent
2026-08-11 10:15 ` [LTP] [PATCH] " Andrea Cervesato via ltp
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.