* [LTP] [PATCH 0/2] Update test timeouts in an automated way
@ 2025-01-21 12:34 Cyril Hrubis
2025-01-21 12:34 ` [LTP] [PATCH 1/2] scripts: Add simple script for calculating timeouts Cyril Hrubis
2025-01-21 12:34 ` [LTP] [PATCH 2/2] syscalls: Update test timeouts Cyril Hrubis
0 siblings, 2 replies; 8+ messages in thread
From: Cyril Hrubis @ 2025-01-21 12:34 UTC (permalink / raw)
To: ltp
First patch adds a script that can parse kirk test results, calculate
timeouts and patch tests with the newly calculated timeouts.
Second patch updates tests timeouts using this script with a results
captured on RPi zero.
Cyril Hrubis (2):
scripts: Add simple script for calculating timeouts
syscalls: Update test timeouts
scripts/calc_timeouts.py | 133 ++++++++++++++++++
testcases/kernel/syscalls/access/access01.c | 1 +
testcases/kernel/syscalls/add_key/add_key05.c | 1 +
testcases/kernel/syscalls/alarm/alarm05.c | 1 +
testcases/kernel/syscalls/alarm/alarm06.c | 1 +
testcases/kernel/syscalls/alarm/alarm07.c | 1 +
testcases/kernel/syscalls/bind/bind04.c | 1 +
testcases/kernel/syscalls/bpf/bpf_prog05.c | 1 +
testcases/kernel/syscalls/bpf/bpf_prog06.c | 1 +
testcases/kernel/syscalls/bpf/bpf_prog07.c | 1 +
.../kernel/syscalls/cachestat/cachestat01.c | 1 +
.../kernel/syscalls/cachestat/cachestat04.c | 1 +
testcases/kernel/syscalls/chdir/chdir01.c | 1 +
.../kernel/syscalls/clock_gettime/leapsec01.c | 1 +
.../clock_nanosleep/clock_nanosleep01.c | 1 +
.../syscalls/clock_settime/clock_settime03.c | 1 +
.../syscalls/close_range/close_range01.c | 1 +
testcases/kernel/syscalls/connect/connect02.c | 1 +
testcases/kernel/syscalls/creat/creat05.c | 1 +
testcases/kernel/syscalls/creat/creat09.c | 1 +
testcases/kernel/syscalls/execve/execve05.c | 1 +
.../kernel/syscalls/execveat/execveat03.c | 1 +
.../kernel/syscalls/fallocate/fallocate04.c | 1 +
.../kernel/syscalls/fallocate/fallocate05.c | 1 +
.../kernel/syscalls/fallocate/fallocate06.c | 2 +-
.../kernel/syscalls/fanotify/fanotify01.c | 1 +
.../kernel/syscalls/fanotify/fanotify03.c | 1 +
.../kernel/syscalls/fanotify/fanotify05.c | 1 +
.../kernel/syscalls/fanotify/fanotify06.c | 1 +
.../kernel/syscalls/fanotify/fanotify09.c | 1 +
.../kernel/syscalls/fanotify/fanotify10.c | 1 +
.../kernel/syscalls/fchmodat2/fchmodat2_01.c | 1 +
testcases/kernel/syscalls/fcntl/fcntl14.c | 1 +
testcases/kernel/syscalls/fcntl/fcntl36.c | 1 +
.../kernel/syscalls/fdatasync/fdatasync03.c | 1 +
.../kernel/syscalls/fgetxattr/fgetxattr01.c | 1 +
.../syscalls/fremovexattr/fremovexattr01.c | 1 +
.../syscalls/fremovexattr/fremovexattr02.c | 1 +
.../kernel/syscalls/fsconfig/fsconfig01.c | 1 +
.../kernel/syscalls/fsconfig/fsconfig03.c | 1 +
.../kernel/syscalls/fsetxattr/fsetxattr01.c | 1 +
testcases/kernel/syscalls/fsmount/fsmount01.c | 1 +
testcases/kernel/syscalls/fsmount/fsmount02.c | 1 +
testcases/kernel/syscalls/fsopen/fsopen01.c | 1 +
testcases/kernel/syscalls/fspick/fspick01.c | 1 +
testcases/kernel/syscalls/fspick/fspick02.c | 1 +
testcases/kernel/syscalls/fstatfs/fstatfs01.c | 1 +
testcases/kernel/syscalls/fsync/fsync01.c | 1 +
testcases/kernel/syscalls/fsync/fsync04.c | 1 +
testcases/kernel/syscalls/getpid/getpid01.c | 1 +
.../kernel/syscalls/getxattr/getxattr02.c | 1 +
.../kernel/syscalls/getxattr/getxattr03.c | 1 +
testcases/kernel/syscalls/inotify/inotify03.c | 1 +
testcases/kernel/syscalls/inotify/inotify05.c | 1 +
testcases/kernel/syscalls/inotify/inotify07.c | 1 +
testcases/kernel/syscalls/inotify/inotify08.c | 1 +
testcases/kernel/syscalls/inotify/inotify11.c | 1 +
testcases/kernel/syscalls/ioctl/ioctl02.c | 1 +
testcases/kernel/syscalls/ioctl/ioctl04.c | 1 +
testcases/kernel/syscalls/ioctl/ioctl08.c | 1 +
testcases/kernel/syscalls/ioctl/ioctl09.c | 1 +
.../kernel/syscalls/ioctl/ioctl_ficlone02.c | 1 +
.../kernel/syscalls/ioctl/ioctl_ficlone03.c | 1 +
.../syscalls/ioctl/ioctl_ficlonerange01.c | 1 +
.../syscalls/ioctl/ioctl_ficlonerange02.c | 1 +
.../kernel/syscalls/ioctl/ioctl_loop01.c | 1 +
66 files changed, 198 insertions(+), 1 deletion(-)
create mode 100755 scripts/calc_timeouts.py
--
2.45.2
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 8+ messages in thread
* [LTP] [PATCH 1/2] scripts: Add simple script for calculating timeouts
2025-01-21 12:34 [LTP] [PATCH 0/2] Update test timeouts in an automated way Cyril Hrubis
@ 2025-01-21 12:34 ` Cyril Hrubis
2025-01-21 13:12 ` Andrea Cervesato via ltp
2025-01-21 12:34 ` [LTP] [PATCH 2/2] syscalls: Update test timeouts Cyril Hrubis
1 sibling, 1 reply; 8+ messages in thread
From: Cyril Hrubis @ 2025-01-21 12:34 UTC (permalink / raw)
To: ltp
This script parses JSON results from kirk and LTP metadata in order
calculate timeouts for tests based on the result file and can even patch
tests automatically.
The script does:
- Take the results and pick all tests that run for longer than 0.5s.
Multiplies the time with a constant (currently 1.2) to get a suggested
timeout.
- Exclude tests that have runtime defined since these are controller
by the runtime (that filters out all fuzzy sync tests).
There is a special case for timer tests that define runtime only
dynamically in the timer library code. This should be possibly fixed
with special value for the .runtime in tst_test. E.g.
TST_RUNTIME_DYNAMIC for tests that only set runtime in the setup.
- Normalize the timeout per a single filesystem run if test is running for
more than one filesystem.
- Tests that do not have a metadata record are old library tests which
which cannot be patched but are printed in a separate table if we
request a table to be printed.
- If patching option is selected tests are update with newly calculated
timeout. By default we only increase timeouts but that can be
overrided with the -o option.
Signed-off-by: Cyril Hrubis <chrubis@suse.cz>
---
scripts/calc_timeouts.py | 133 +++++++++++++++++++++++++++++++++++++++
1 file changed, 133 insertions(+)
create mode 100755 scripts/calc_timeouts.py
diff --git a/scripts/calc_timeouts.py b/scripts/calc_timeouts.py
new file mode 100755
index 000000000..c69ab8f57
--- /dev/null
+++ b/scripts/calc_timeouts.py
@@ -0,0 +1,133 @@
+#!/usr/bin/python
+import re
+import json
+import getopt
+import sys
+from os import system
+
+# Top level directory path
+top_dir = '../'
+
+# The test runtime is multiplied by this to get a timeout
+timeout_mul = 1.2
+
+def patch(fname, new_timeout, patch_override):
+
+ orig_timeout = None
+ file_path = top_dir + fname
+
+ with open(file_path, 'r') as c_source:
+ for line in c_source:
+ timeout = re.search(r'\s*.timeout\s*=\s*(\d+).', line)
+ if timeout:
+ orig_timeout = int(timeout.group(1))
+
+ if orig_timeout:
+ if orig_timeout < new_timeout or patch_override:
+ print("CHANGE %s timeout %i -> %i" % (fname, orig_timeout, new_timeout))
+ system("sed -i 's/\\.timeout = [0-9]*/\\.timeout = " + str(new_timeout) + "/' " + file_path)
+ else:
+ print("KEEP %s timeout %i (new %i)" % (fname, orig_timeout, new_timeout))
+ else:
+ print("ADD %s timeout %i" % (fname, new_timeout))
+ system("sed -i '/static struct tst_test test = {/a\\\\t.timeout = " + str(new_timeout) + ",' " + file_path)
+
+def patch_all(timeouts, patch_override):
+ for timeout in timeouts:
+ if timeout[3]:
+ patch(timeout[3], timeout[1], patch_override)
+
+def print_table(timeouts):
+ timeouts.sort(key=lambda x: x[1], reverse=True)
+
+ total = 0;
+
+ print("Old library tests\n-----------------\n");
+ for timeout in timeouts:
+ if not timeout[2]:
+ print("%-30s %i" % (timeout[0], timeout[1]))
+ total+=1
+
+ print("\n\t%i tests in total" % total)
+
+ total = 0;
+
+ print("\nNew library tests\n-----------------\n");
+ for timeout in timeouts:
+ if timeout[2]:
+ print("%-30s %i" % (timeout[0], timeout[1]))
+ total+=1
+
+ print("\n\t%i tests in total" % total)
+
+def parse_data(results_path):
+ timeouts = []
+
+ with open(results_path, 'r') as file:
+ results = json.load(file)
+
+ with open(top_dir + 'metadata/ltp.json', 'r') as file:
+ metadata = json.load(file)
+
+ for test in results['results']:
+ name = test['test_fqn']
+ duration = test['test']['duration']
+ # If test runs for all_filesystems normalize the runtime per a single filesystem
+ filesystems = max(1, test['test']['log'].count('TINFO: Formatting /'))
+ # Check if test is new library test
+ test_is_newlib = name in metadata['tests']
+ # Store test file path
+ path = None if not test_is_newlib else metadata['tests'][name]['fname']
+ # Filter out tests with runtime
+ test_has_runtime = False if not test_is_newlib else 'runtime' in metadata['tests'][name]
+ # Timer tests define runtime dynamically in timer library
+ if test_is_newlib and 'sample' in metadata['tests'][name]:
+ test_has_runtime = True
+ # Select tests that does not have runtime and are executed for longer time
+ if not test_has_runtime and duration >= 0.5:
+ timeouts.append((name, int(timeout_mul * duration/filesystems + 0.5), test_is_newlib, path))
+
+ return timeouts
+
+def print_help():
+ print('calc_timeouts.py [OPTION] [RESULT].json')
+ print('\t-h prints this help')
+ print('\t-o override test timeouts, by default timeouts are only increased')
+ print('\t-p patch testcases with updated timeouts')
+ print('\t-t prints table of tests with suggested timeouts')
+
+try:
+ opts, args = getopt.getopt(sys.argv[1:], "hopt")
+except:
+ print_help()
+ sys.exit(1)
+
+opt_print_table = False
+opt_patch_tests = False
+opt_patch_override = False
+
+for opt,arg in opts:
+ if opt == '-h':
+ print_help()
+ sys.exit(0)
+ if opt == '-o':
+ opt_patch_override = True
+ if opt == '-p':
+ opt_patch_tests = True
+ if opt == '-t':
+ opt_print_table = True
+
+if not opt_print_table and not opt_patch_tests:
+ print("No action selected!\n")
+ print_help()
+ sys.exit(1)
+
+results = args[0] if args else 'results.json'
+
+timeouts = parse_data(results)
+
+if opt_print_table:
+ print_table(timeouts)
+
+if opt_patch_tests:
+ patch_all(timeouts, opt_patch_override)
--
2.45.2
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [LTP] [PATCH 2/2] syscalls: Update test timeouts
2025-01-21 12:34 [LTP] [PATCH 0/2] Update test timeouts in an automated way Cyril Hrubis
2025-01-21 12:34 ` [LTP] [PATCH 1/2] scripts: Add simple script for calculating timeouts Cyril Hrubis
@ 2025-01-21 12:34 ` Cyril Hrubis
1 sibling, 0 replies; 8+ messages in thread
From: Cyril Hrubis @ 2025-01-21 12:34 UTC (permalink / raw)
To: ltp
This change was genered by:
- runnning syscalls via kirk on RPi zero and saving the json result
- running 'cd scripts && calc_timeouts.py -p results.json'
Signed-off-by: Cyril Hrubis <chrubis@suse.cz>
---
testcases/kernel/syscalls/access/access01.c | 1 +
testcases/kernel/syscalls/add_key/add_key05.c | 1 +
testcases/kernel/syscalls/alarm/alarm05.c | 1 +
testcases/kernel/syscalls/alarm/alarm06.c | 1 +
testcases/kernel/syscalls/alarm/alarm07.c | 1 +
testcases/kernel/syscalls/bind/bind04.c | 1 +
testcases/kernel/syscalls/bpf/bpf_prog05.c | 1 +
testcases/kernel/syscalls/bpf/bpf_prog06.c | 1 +
testcases/kernel/syscalls/bpf/bpf_prog07.c | 1 +
testcases/kernel/syscalls/cachestat/cachestat01.c | 1 +
testcases/kernel/syscalls/cachestat/cachestat04.c | 1 +
testcases/kernel/syscalls/chdir/chdir01.c | 1 +
testcases/kernel/syscalls/clock_gettime/leapsec01.c | 1 +
testcases/kernel/syscalls/clock_nanosleep/clock_nanosleep01.c | 1 +
testcases/kernel/syscalls/clock_settime/clock_settime03.c | 1 +
testcases/kernel/syscalls/close_range/close_range01.c | 1 +
testcases/kernel/syscalls/connect/connect02.c | 1 +
testcases/kernel/syscalls/creat/creat05.c | 1 +
testcases/kernel/syscalls/creat/creat09.c | 1 +
testcases/kernel/syscalls/execve/execve05.c | 1 +
testcases/kernel/syscalls/execveat/execveat03.c | 1 +
testcases/kernel/syscalls/fallocate/fallocate04.c | 1 +
testcases/kernel/syscalls/fallocate/fallocate05.c | 1 +
testcases/kernel/syscalls/fallocate/fallocate06.c | 2 +-
testcases/kernel/syscalls/fanotify/fanotify01.c | 1 +
testcases/kernel/syscalls/fanotify/fanotify03.c | 1 +
testcases/kernel/syscalls/fanotify/fanotify05.c | 1 +
testcases/kernel/syscalls/fanotify/fanotify06.c | 1 +
testcases/kernel/syscalls/fanotify/fanotify09.c | 1 +
testcases/kernel/syscalls/fanotify/fanotify10.c | 1 +
testcases/kernel/syscalls/fchmodat2/fchmodat2_01.c | 1 +
testcases/kernel/syscalls/fcntl/fcntl14.c | 1 +
testcases/kernel/syscalls/fcntl/fcntl36.c | 1 +
testcases/kernel/syscalls/fdatasync/fdatasync03.c | 1 +
testcases/kernel/syscalls/fgetxattr/fgetxattr01.c | 1 +
testcases/kernel/syscalls/fremovexattr/fremovexattr01.c | 1 +
testcases/kernel/syscalls/fremovexattr/fremovexattr02.c | 1 +
testcases/kernel/syscalls/fsconfig/fsconfig01.c | 1 +
testcases/kernel/syscalls/fsconfig/fsconfig03.c | 1 +
testcases/kernel/syscalls/fsetxattr/fsetxattr01.c | 1 +
testcases/kernel/syscalls/fsmount/fsmount01.c | 1 +
testcases/kernel/syscalls/fsmount/fsmount02.c | 1 +
testcases/kernel/syscalls/fsopen/fsopen01.c | 1 +
testcases/kernel/syscalls/fspick/fspick01.c | 1 +
testcases/kernel/syscalls/fspick/fspick02.c | 1 +
testcases/kernel/syscalls/fstatfs/fstatfs01.c | 1 +
testcases/kernel/syscalls/fsync/fsync01.c | 1 +
testcases/kernel/syscalls/fsync/fsync04.c | 1 +
testcases/kernel/syscalls/getpid/getpid01.c | 1 +
testcases/kernel/syscalls/getxattr/getxattr02.c | 1 +
testcases/kernel/syscalls/getxattr/getxattr03.c | 1 +
testcases/kernel/syscalls/inotify/inotify03.c | 1 +
testcases/kernel/syscalls/inotify/inotify05.c | 1 +
testcases/kernel/syscalls/inotify/inotify07.c | 1 +
testcases/kernel/syscalls/inotify/inotify08.c | 1 +
testcases/kernel/syscalls/inotify/inotify11.c | 1 +
testcases/kernel/syscalls/ioctl/ioctl02.c | 1 +
testcases/kernel/syscalls/ioctl/ioctl04.c | 1 +
testcases/kernel/syscalls/ioctl/ioctl08.c | 1 +
testcases/kernel/syscalls/ioctl/ioctl09.c | 1 +
testcases/kernel/syscalls/ioctl/ioctl_ficlone02.c | 1 +
testcases/kernel/syscalls/ioctl/ioctl_ficlone03.c | 1 +
testcases/kernel/syscalls/ioctl/ioctl_ficlonerange01.c | 1 +
testcases/kernel/syscalls/ioctl/ioctl_ficlonerange02.c | 1 +
testcases/kernel/syscalls/ioctl/ioctl_loop01.c | 1 +
65 files changed, 65 insertions(+), 1 deletion(-)
diff --git a/testcases/kernel/syscalls/access/access01.c b/testcases/kernel/syscalls/access/access01.c
index 391c8d44b..1c32c6d04 100644
--- a/testcases/kernel/syscalls/access/access01.c
+++ b/testcases/kernel/syscalls/access/access01.c
@@ -314,6 +314,7 @@ static void setup(void)
}
static struct tst_test test = {
+ .timeout = 1,
.needs_tmpdir = 1,
.needs_root = 1,
.forks_child = 1,
diff --git a/testcases/kernel/syscalls/add_key/add_key05.c b/testcases/kernel/syscalls/add_key/add_key05.c
index 3abd58b83..c9a2f840e 100644
--- a/testcases/kernel/syscalls/add_key/add_key05.c
+++ b/testcases/kernel/syscalls/add_key/add_key05.c
@@ -212,6 +212,7 @@ static void cleanup(void)
}
static struct tst_test test = {
+ .timeout = 2,
.test = do_test,
.tcnt = 2,
.needs_root = 1,
diff --git a/testcases/kernel/syscalls/alarm/alarm05.c b/testcases/kernel/syscalls/alarm/alarm05.c
index 2eeb1c22f..82bff69cb 100644
--- a/testcases/kernel/syscalls/alarm/alarm05.c
+++ b/testcases/kernel/syscalls/alarm/alarm05.c
@@ -44,6 +44,7 @@ static void setup(void)
}
static struct tst_test test = {
+ .timeout = 2,
.test_all = run,
.setup = setup,
};
diff --git a/testcases/kernel/syscalls/alarm/alarm06.c b/testcases/kernel/syscalls/alarm/alarm06.c
index 82c0d44bd..2cfa26207 100644
--- a/testcases/kernel/syscalls/alarm/alarm06.c
+++ b/testcases/kernel/syscalls/alarm/alarm06.c
@@ -41,6 +41,7 @@ static void verify_alarm(void)
}
static struct tst_test test = {
+ .timeout = 4,
.setup = setup,
.test_all = verify_alarm,
};
diff --git a/testcases/kernel/syscalls/alarm/alarm07.c b/testcases/kernel/syscalls/alarm/alarm07.c
index 64aed507d..c04745f9d 100644
--- a/testcases/kernel/syscalls/alarm/alarm07.c
+++ b/testcases/kernel/syscalls/alarm/alarm07.c
@@ -47,6 +47,7 @@ static void setup(void)
}
static struct tst_test test = {
+ .timeout = 4,
.test_all = verify_alarm,
.setup = setup,
.forks_child = 1,
diff --git a/testcases/kernel/syscalls/bind/bind04.c b/testcases/kernel/syscalls/bind/bind04.c
index d8456e739..2a46559de 100644
--- a/testcases/kernel/syscalls/bind/bind04.c
+++ b/testcases/kernel/syscalls/bind/bind04.c
@@ -161,6 +161,7 @@ static void test_bind(unsigned int n)
}
static struct tst_test test = {
+ .timeout = 1,
.test = test_bind,
.tcnt = ARRAY_SIZE(testcase_list),
.needs_tmpdir = 1,
diff --git a/testcases/kernel/syscalls/bpf/bpf_prog05.c b/testcases/kernel/syscalls/bpf/bpf_prog05.c
index 08254ba89..050081712 100644
--- a/testcases/kernel/syscalls/bpf/bpf_prog05.c
+++ b/testcases/kernel/syscalls/bpf/bpf_prog05.c
@@ -190,6 +190,7 @@ static void run(void)
}
static struct tst_test test = {
+ .timeout = 20,
.setup = setup,
.test_all = run,
.taint_check = TST_TAINT_W | TST_TAINT_D,
diff --git a/testcases/kernel/syscalls/bpf/bpf_prog06.c b/testcases/kernel/syscalls/bpf/bpf_prog06.c
index cee9616cf..87fdd8060 100644
--- a/testcases/kernel/syscalls/bpf/bpf_prog06.c
+++ b/testcases/kernel/syscalls/bpf/bpf_prog06.c
@@ -131,6 +131,7 @@ static void run(void)
}
static struct tst_test test = {
+ .timeout = 20,
.setup = setup,
.test_all = run,
.min_kver = "5.8",
diff --git a/testcases/kernel/syscalls/bpf/bpf_prog07.c b/testcases/kernel/syscalls/bpf/bpf_prog07.c
index dab5bb8ad..29dfbf2ca 100644
--- a/testcases/kernel/syscalls/bpf/bpf_prog07.c
+++ b/testcases/kernel/syscalls/bpf/bpf_prog07.c
@@ -139,6 +139,7 @@ static void run(void)
}
static struct tst_test test = {
+ .timeout = 20,
.setup = setup,
.test_all = run,
.min_kver = "5.8",
diff --git a/testcases/kernel/syscalls/cachestat/cachestat01.c b/testcases/kernel/syscalls/cachestat/cachestat01.c
index 2dca68885..22f0071d1 100644
--- a/testcases/kernel/syscalls/cachestat/cachestat01.c
+++ b/testcases/kernel/syscalls/cachestat/cachestat01.c
@@ -85,6 +85,7 @@ static void cleanup(void)
}
static struct tst_test test = {
+ .timeout = 13,
.test = run,
.tcnt = 2,
.setup = setup,
diff --git a/testcases/kernel/syscalls/cachestat/cachestat04.c b/testcases/kernel/syscalls/cachestat/cachestat04.c
index a59494451..7cef9897d 100644
--- a/testcases/kernel/syscalls/cachestat/cachestat04.c
+++ b/testcases/kernel/syscalls/cachestat/cachestat04.c
@@ -47,6 +47,7 @@ static void run(void)
}
static struct tst_test test = {
+ .timeout = 2,
.test_all = run,
.mount_device = 1,
.mntpoint = MNTPOINT,
diff --git a/testcases/kernel/syscalls/chdir/chdir01.c b/testcases/kernel/syscalls/chdir/chdir01.c
index d50a8f50c..1c1299332 100644
--- a/testcases/kernel/syscalls/chdir/chdir01.c
+++ b/testcases/kernel/syscalls/chdir/chdir01.c
@@ -149,6 +149,7 @@ static void cleanup(void)
}
static struct tst_test test = {
+ .timeout = 10,
.needs_root = 1,
.mount_device = 1,
.mntpoint = MNTPOINT,
diff --git a/testcases/kernel/syscalls/clock_gettime/leapsec01.c b/testcases/kernel/syscalls/clock_gettime/leapsec01.c
index e623b4107..4cd469dc2 100644
--- a/testcases/kernel/syscalls/clock_gettime/leapsec01.c
+++ b/testcases/kernel/syscalls/clock_gettime/leapsec01.c
@@ -196,6 +196,7 @@ static void cleanup(void)
}
static struct tst_test test = {
+ .timeout = 40,
.test_all = run_leapsec,
.setup = setup,
.cleanup = cleanup,
diff --git a/testcases/kernel/syscalls/clock_nanosleep/clock_nanosleep01.c b/testcases/kernel/syscalls/clock_nanosleep/clock_nanosleep01.c
index eef8a5992..55e7b294e 100644
--- a/testcases/kernel/syscalls/clock_nanosleep/clock_nanosleep01.c
+++ b/testcases/kernel/syscalls/clock_nanosleep/clock_nanosleep01.c
@@ -219,6 +219,7 @@ static void do_test(unsigned int i)
}
static struct tst_test test = {
+ .timeout = 3,
.tcnt = ARRAY_SIZE(tcase),
.test = do_test,
.test_variants = ARRAY_SIZE(variants),
diff --git a/testcases/kernel/syscalls/clock_settime/clock_settime03.c b/testcases/kernel/syscalls/clock_settime/clock_settime03.c
index f196a257c..692e63788 100644
--- a/testcases/kernel/syscalls/clock_settime/clock_settime03.c
+++ b/testcases/kernel/syscalls/clock_settime/clock_settime03.c
@@ -104,6 +104,7 @@ static void run(void)
}
static struct tst_test test = {
+ .timeout = 4,
.test_all = run,
.test_variants = ARRAY_SIZE(variants),
.setup = setup,
diff --git a/testcases/kernel/syscalls/close_range/close_range01.c b/testcases/kernel/syscalls/close_range/close_range01.c
index 110ffa9b7..941f3e403 100644
--- a/testcases/kernel/syscalls/close_range/close_range01.c
+++ b/testcases/kernel/syscalls/close_range/close_range01.c
@@ -191,6 +191,7 @@ static void run(unsigned int n)
}
static struct tst_test test = {
+ .timeout = 9,
.tcnt = 4,
.forks_child = 1,
.mount_device = 1,
diff --git a/testcases/kernel/syscalls/connect/connect02.c b/testcases/kernel/syscalls/connect/connect02.c
index e20214e24..087b514bf 100644
--- a/testcases/kernel/syscalls/connect/connect02.c
+++ b/testcases/kernel/syscalls/connect/connect02.c
@@ -126,6 +126,7 @@ static void run(void)
}
static struct tst_test test = {
+ .timeout = 3,
.test_all = run,
.setup = setup,
.cleanup = cleanup,
diff --git a/testcases/kernel/syscalls/creat/creat05.c b/testcases/kernel/syscalls/creat/creat05.c
index bf4099439..32074a449 100644
--- a/testcases/kernel/syscalls/creat/creat05.c
+++ b/testcases/kernel/syscalls/creat/creat05.c
@@ -74,6 +74,7 @@ static void cleanup(void)
}
static struct tst_test test = {
+ .timeout = 1,
.test_all = verify_creat,
.needs_tmpdir = 1,
.setup = setup,
diff --git a/testcases/kernel/syscalls/creat/creat09.c b/testcases/kernel/syscalls/creat/creat09.c
index a5d3740ac..d18165772 100644
--- a/testcases/kernel/syscalls/creat/creat09.c
+++ b/testcases/kernel/syscalls/creat/creat09.c
@@ -138,6 +138,7 @@ static void cleanup(void)
}
static struct tst_test test = {
+ .timeout = 1,
.test = run,
.setup = setup,
.cleanup = cleanup,
diff --git a/testcases/kernel/syscalls/execve/execve05.c b/testcases/kernel/syscalls/execve/execve05.c
index d87d7446d..530c7cc89 100644
--- a/testcases/kernel/syscalls/execve/execve05.c
+++ b/testcases/kernel/syscalls/execve/execve05.c
@@ -62,6 +62,7 @@ static void setup(void)
}
static struct tst_test test = {
+ .timeout = 3,
.test_all = verify_execve,
.options = (struct tst_option[]) {
{"n:", &opt_nchild, "Numbers of children"},
diff --git a/testcases/kernel/syscalls/execveat/execveat03.c b/testcases/kernel/syscalls/execveat/execveat03.c
index 057d83278..684f0d0c6 100644
--- a/testcases/kernel/syscalls/execveat/execveat03.c
+++ b/testcases/kernel/syscalls/execveat/execveat03.c
@@ -68,6 +68,7 @@ static void setup(void)
}
static struct tst_test test = {
+ .timeout = 1,
.needs_root = 1,
.mount_device = 1,
.needs_overlay = 1,
diff --git a/testcases/kernel/syscalls/fallocate/fallocate04.c b/testcases/kernel/syscalls/fallocate/fallocate04.c
index 7b285fb5d..3a8ea5fa7 100644
--- a/testcases/kernel/syscalls/fallocate/fallocate04.c
+++ b/testcases/kernel/syscalls/fallocate/fallocate04.c
@@ -282,6 +282,7 @@ static void cleanup(void)
}
static struct tst_test test = {
+ .timeout = 9,
.options = (struct tst_option[]) {
{"v", &verbose, "Turns on verbose mode"},
{}
diff --git a/testcases/kernel/syscalls/fallocate/fallocate05.c b/testcases/kernel/syscalls/fallocate/fallocate05.c
index 732a2f15d..f17cc993e 100644
--- a/testcases/kernel/syscalls/fallocate/fallocate05.c
+++ b/testcases/kernel/syscalls/fallocate/fallocate05.c
@@ -172,6 +172,7 @@ static void cleanup(void)
}
static struct tst_test test = {
+ .timeout = 42,
.needs_root = 1,
.mount_device = 1,
.mntpoint = MNTPOINT,
diff --git a/testcases/kernel/syscalls/fallocate/fallocate06.c b/testcases/kernel/syscalls/fallocate/fallocate06.c
index 5e1454c30..0e1509ace 100644
--- a/testcases/kernel/syscalls/fallocate/fallocate06.c
+++ b/testcases/kernel/syscalls/fallocate/fallocate06.c
@@ -261,7 +261,7 @@ static struct tst_test test = {
.tcnt = ARRAY_SIZE(testcase_list),
.needs_root = 1,
.dev_min_size = 1024,
- .timeout = 120,
+ .timeout = 150,
.mount_device = 1,
.mntpoint = MNTPOINT,
.all_filesystems = 1,
diff --git a/testcases/kernel/syscalls/fanotify/fanotify01.c b/testcases/kernel/syscalls/fanotify/fanotify01.c
index 5d18fe851..c7e759166 100644
--- a/testcases/kernel/syscalls/fanotify/fanotify01.c
+++ b/testcases/kernel/syscalls/fanotify/fanotify01.c
@@ -387,6 +387,7 @@ static void cleanup(void)
}
static struct tst_test test = {
+ .timeout = 10,
.test = test_fanotify,
.tcnt = ARRAY_SIZE(tcases),
.setup = setup,
diff --git a/testcases/kernel/syscalls/fanotify/fanotify03.c b/testcases/kernel/syscalls/fanotify/fanotify03.c
index 3ed78e5fa..64c933c19 100644
--- a/testcases/kernel/syscalls/fanotify/fanotify03.c
+++ b/testcases/kernel/syscalls/fanotify/fanotify03.c
@@ -343,6 +343,7 @@ static const char *const resource_files[] = {
};
static struct tst_test test = {
+ .timeout = 1,
.test = test_fanotify,
.tcnt = ARRAY_SIZE(tcases),
.setup = setup,
diff --git a/testcases/kernel/syscalls/fanotify/fanotify05.c b/testcases/kernel/syscalls/fanotify/fanotify05.c
index 12c240881..435a91c49 100644
--- a/testcases/kernel/syscalls/fanotify/fanotify05.c
+++ b/testcases/kernel/syscalls/fanotify/fanotify05.c
@@ -208,6 +208,7 @@ static void cleanup(void)
}
static struct tst_test test = {
+ .timeout = 13,
.test = test_fanotify,
.tcnt = ARRAY_SIZE(tcases),
.setup = setup,
diff --git a/testcases/kernel/syscalls/fanotify/fanotify06.c b/testcases/kernel/syscalls/fanotify/fanotify06.c
index 8779e34d9..b4992afa0 100644
--- a/testcases/kernel/syscalls/fanotify/fanotify06.c
+++ b/testcases/kernel/syscalls/fanotify/fanotify06.c
@@ -236,6 +236,7 @@ static void cleanup(void)
}
static struct tst_test test = {
+ .timeout = 1,
.test = test_fanotify,
.tcnt = ARRAY_SIZE(tcases),
.setup = setup,
diff --git a/testcases/kernel/syscalls/fanotify/fanotify09.c b/testcases/kernel/syscalls/fanotify/fanotify09.c
index 48b198b94..45303c31e 100644
--- a/testcases/kernel/syscalls/fanotify/fanotify09.c
+++ b/testcases/kernel/syscalls/fanotify/fanotify09.c
@@ -507,6 +507,7 @@ static void cleanup(void)
}
static struct tst_test test = {
+ .timeout = 1,
.test = test_fanotify,
.tcnt = ARRAY_SIZE(tcases),
.setup = setup,
diff --git a/testcases/kernel/syscalls/fanotify/fanotify10.c b/testcases/kernel/syscalls/fanotify/fanotify10.c
index eedd1442f..23e9554b3 100644
--- a/testcases/kernel/syscalls/fanotify/fanotify10.c
+++ b/testcases/kernel/syscalls/fanotify/fanotify10.c
@@ -959,6 +959,7 @@ static void cleanup(void)
}
static struct tst_test test = {
+ .timeout = 10,
.test = test_fanotify,
.tcnt = ARRAY_SIZE(tcases),
.test_variants = 2,
diff --git a/testcases/kernel/syscalls/fchmodat2/fchmodat2_01.c b/testcases/kernel/syscalls/fchmodat2/fchmodat2_01.c
index f026b18df..e58be31c4 100644
--- a/testcases/kernel/syscalls/fchmodat2/fchmodat2_01.c
+++ b/testcases/kernel/syscalls/fchmodat2/fchmodat2_01.c
@@ -104,6 +104,7 @@ static void cleanup(void)
}
static struct tst_test test = {
+ .timeout = 9,
.test_all = run,
.setup = setup,
.cleanup = cleanup,
diff --git a/testcases/kernel/syscalls/fcntl/fcntl14.c b/testcases/kernel/syscalls/fcntl/fcntl14.c
index 367701d68..21dbede5c 100644
--- a/testcases/kernel/syscalls/fcntl/fcntl14.c
+++ b/testcases/kernel/syscalls/fcntl/fcntl14.c
@@ -263,6 +263,7 @@ static void cleanup(void)
}
static struct tst_test test = {
+ .timeout = 8,
.test_all = run,
.setup = setup,
.cleanup = cleanup,
diff --git a/testcases/kernel/syscalls/fcntl/fcntl36.c b/testcases/kernel/syscalls/fcntl/fcntl36.c
index fabdbe905..19a5a0303 100644
--- a/testcases/kernel/syscalls/fcntl/fcntl36.c
+++ b/testcases/kernel/syscalls/fcntl/fcntl36.c
@@ -387,6 +387,7 @@ static void tests(unsigned int i)
}
static struct tst_test test = {
+ .timeout = 9,
.needs_tmpdir = 1,
.test = tests,
.tcnt = ARRAY_SIZE(tcases),
diff --git a/testcases/kernel/syscalls/fdatasync/fdatasync03.c b/testcases/kernel/syscalls/fdatasync/fdatasync03.c
index 5f3e0c96f..f1b5f0fb8 100644
--- a/testcases/kernel/syscalls/fdatasync/fdatasync03.c
+++ b/testcases/kernel/syscalls/fdatasync/fdatasync03.c
@@ -53,6 +53,7 @@ static void verify_fdatasync(void)
}
static struct tst_test test = {
+ .timeout = 15,
.needs_root = 1,
.mount_device = 1,
.all_filesystems = 1,
diff --git a/testcases/kernel/syscalls/fgetxattr/fgetxattr01.c b/testcases/kernel/syscalls/fgetxattr/fgetxattr01.c
index 52e6e44ab..eefddd829 100644
--- a/testcases/kernel/syscalls/fgetxattr/fgetxattr01.c
+++ b/testcases/kernel/syscalls/fgetxattr/fgetxattr01.c
@@ -134,6 +134,7 @@ static void cleanup(void)
}
static struct tst_test test = {
+ .timeout = 10,
.setup = setup,
.test = verify_fgetxattr,
.cleanup = cleanup,
diff --git a/testcases/kernel/syscalls/fremovexattr/fremovexattr01.c b/testcases/kernel/syscalls/fremovexattr/fremovexattr01.c
index 907d210d1..aca2fce7c 100644
--- a/testcases/kernel/syscalls/fremovexattr/fremovexattr01.c
+++ b/testcases/kernel/syscalls/fremovexattr/fremovexattr01.c
@@ -83,6 +83,7 @@ static void setup(void)
}
static struct tst_test test = {
+ .timeout = 12,
.setup = setup,
.test_all = verify_fremovexattr,
.cleanup = cleanup,
diff --git a/testcases/kernel/syscalls/fremovexattr/fremovexattr02.c b/testcases/kernel/syscalls/fremovexattr/fremovexattr02.c
index eb106a8fa..78af8be32 100644
--- a/testcases/kernel/syscalls/fremovexattr/fremovexattr02.c
+++ b/testcases/kernel/syscalls/fremovexattr/fremovexattr02.c
@@ -105,6 +105,7 @@ static void setup(void)
}
static struct tst_test test = {
+ .timeout = 10,
.setup = setup,
.test = verify_fremovexattr,
.cleanup = cleanup,
diff --git a/testcases/kernel/syscalls/fsconfig/fsconfig01.c b/testcases/kernel/syscalls/fsconfig/fsconfig01.c
index a585daa6d..678d21815 100644
--- a/testcases/kernel/syscalls/fsconfig/fsconfig01.c
+++ b/testcases/kernel/syscalls/fsconfig/fsconfig01.c
@@ -82,6 +82,7 @@ static void run(void)
}
static struct tst_test test = {
+ .timeout = 10,
.test_all = run,
.setup = fsopen_supported_by_kernel,
.cleanup = cleanup,
diff --git a/testcases/kernel/syscalls/fsconfig/fsconfig03.c b/testcases/kernel/syscalls/fsconfig/fsconfig03.c
index 0ba5355d3..503753636 100644
--- a/testcases/kernel/syscalls/fsconfig/fsconfig03.c
+++ b/testcases/kernel/syscalls/fsconfig/fsconfig03.c
@@ -80,6 +80,7 @@ static void cleanup(void)
}
static struct tst_test test = {
+ .timeout = 9,
.test_all = run,
.setup = setup,
.cleanup = cleanup,
diff --git a/testcases/kernel/syscalls/fsetxattr/fsetxattr01.c b/testcases/kernel/syscalls/fsetxattr/fsetxattr01.c
index b65b27bdf..73e1fcfb7 100644
--- a/testcases/kernel/syscalls/fsetxattr/fsetxattr01.c
+++ b/testcases/kernel/syscalls/fsetxattr/fsetxattr01.c
@@ -214,6 +214,7 @@ static void setup(void)
}
static struct tst_test test = {
+ .timeout = 10,
.setup = setup,
.test = verify_fsetxattr,
.cleanup = cleanup,
diff --git a/testcases/kernel/syscalls/fsmount/fsmount01.c b/testcases/kernel/syscalls/fsmount/fsmount01.c
index 5f755863f..6dafe25a8 100644
--- a/testcases/kernel/syscalls/fsmount/fsmount01.c
+++ b/testcases/kernel/syscalls/fsmount/fsmount01.c
@@ -88,6 +88,7 @@ static void run(unsigned int n)
}
static struct tst_test test = {
+ .timeout = 10,
.tcnt = ARRAY_SIZE(tcases),
.test = run,
.setup = fsopen_supported_by_kernel,
diff --git a/testcases/kernel/syscalls/fsmount/fsmount02.c b/testcases/kernel/syscalls/fsmount/fsmount02.c
index a4f42dc18..55f0e2f28 100644
--- a/testcases/kernel/syscalls/fsmount/fsmount02.c
+++ b/testcases/kernel/syscalls/fsmount/fsmount02.c
@@ -68,6 +68,7 @@ static void run(unsigned int n)
}
static struct tst_test test = {
+ .timeout = 9,
.tcnt = ARRAY_SIZE(tcases),
.test = run,
.setup = setup,
diff --git a/testcases/kernel/syscalls/fsopen/fsopen01.c b/testcases/kernel/syscalls/fsopen/fsopen01.c
index c2c719c96..9dd87b99f 100644
--- a/testcases/kernel/syscalls/fsopen/fsopen01.c
+++ b/testcases/kernel/syscalls/fsopen/fsopen01.c
@@ -69,6 +69,7 @@ out:
}
static struct tst_test test = {
+ .timeout = 9,
.tcnt = ARRAY_SIZE(tcases),
.test = run,
.setup = fsopen_supported_by_kernel,
diff --git a/testcases/kernel/syscalls/fspick/fspick01.c b/testcases/kernel/syscalls/fspick/fspick01.c
index d3309a912..d03cacd3d 100644
--- a/testcases/kernel/syscalls/fspick/fspick01.c
+++ b/testcases/kernel/syscalls/fspick/fspick01.c
@@ -56,6 +56,7 @@ out:
}
static struct tst_test test = {
+ .timeout = 9,
.tcnt = ARRAY_SIZE(tcases),
.test = run,
.setup = fsopen_supported_by_kernel,
diff --git a/testcases/kernel/syscalls/fspick/fspick02.c b/testcases/kernel/syscalls/fspick/fspick02.c
index f9a3697c1..89bdd2cc8 100644
--- a/testcases/kernel/syscalls/fspick/fspick02.c
+++ b/testcases/kernel/syscalls/fspick/fspick02.c
@@ -43,6 +43,7 @@ static void run(unsigned int n)
}
static struct tst_test test = {
+ .timeout = 9,
.tcnt = ARRAY_SIZE(tcases),
.test = run,
.setup = fsopen_supported_by_kernel,
diff --git a/testcases/kernel/syscalls/fstatfs/fstatfs01.c b/testcases/kernel/syscalls/fstatfs/fstatfs01.c
index 9d3909ace..044ab6548 100644
--- a/testcases/kernel/syscalls/fstatfs/fstatfs01.c
+++ b/testcases/kernel/syscalls/fstatfs/fstatfs01.c
@@ -56,6 +56,7 @@ static void cleanup(void)
}
static struct tst_test test = {
+ .timeout = 9,
.setup = setup,
.cleanup = cleanup,
.tcnt = ARRAY_SIZE(tcases),
diff --git a/testcases/kernel/syscalls/fsync/fsync01.c b/testcases/kernel/syscalls/fsync/fsync01.c
index 072245fc8..7ae5296c7 100644
--- a/testcases/kernel/syscalls/fsync/fsync01.c
+++ b/testcases/kernel/syscalls/fsync/fsync01.c
@@ -44,6 +44,7 @@ static void cleanup(void)
}
static struct tst_test test = {
+ .timeout = 10,
.cleanup = cleanup,
.setup = setup,
.test_all = verify_fsync,
diff --git a/testcases/kernel/syscalls/fsync/fsync04.c b/testcases/kernel/syscalls/fsync/fsync04.c
index 9aa1584c1..f7553ff58 100644
--- a/testcases/kernel/syscalls/fsync/fsync04.c
+++ b/testcases/kernel/syscalls/fsync/fsync04.c
@@ -53,6 +53,7 @@ static void verify_fsync(void)
}
static struct tst_test test = {
+ .timeout = 17,
.needs_root = 1,
.mount_device = 1,
.all_filesystems = 1,
diff --git a/testcases/kernel/syscalls/getpid/getpid01.c b/testcases/kernel/syscalls/getpid/getpid01.c
index 495002037..314c45d09 100644
--- a/testcases/kernel/syscalls/getpid/getpid01.c
+++ b/testcases/kernel/syscalls/getpid/getpid01.c
@@ -43,6 +43,7 @@ static void verify_getpid(void)
}
static struct tst_test test = {
+ .timeout = 1,
.setup = setup,
.forks_child = 1,
.test_all = verify_getpid,
diff --git a/testcases/kernel/syscalls/getxattr/getxattr02.c b/testcases/kernel/syscalls/getxattr/getxattr02.c
index 5a84d876c..593ad7b8c 100644
--- a/testcases/kernel/syscalls/getxattr/getxattr02.c
+++ b/testcases/kernel/syscalls/getxattr/getxattr02.c
@@ -105,6 +105,7 @@ static void setup(void)
}
static struct tst_test test = {
+ .timeout = 10,
.all_filesystems = 1,
.needs_root = 1,
.mntpoint = MNTPOINT,
diff --git a/testcases/kernel/syscalls/getxattr/getxattr03.c b/testcases/kernel/syscalls/getxattr/getxattr03.c
index 1fe4ba48f..85f26402a 100644
--- a/testcases/kernel/syscalls/getxattr/getxattr03.c
+++ b/testcases/kernel/syscalls/getxattr/getxattr03.c
@@ -37,6 +37,7 @@ static void setup(void)
}
static struct tst_test test = {
+ .timeout = 14,
.all_filesystems = 1,
.needs_root = 1,
.mntpoint = MNTPOINT,
diff --git a/testcases/kernel/syscalls/inotify/inotify03.c b/testcases/kernel/syscalls/inotify/inotify03.c
index ff025b360..4ee5e9461 100644
--- a/testcases/kernel/syscalls/inotify/inotify03.c
+++ b/testcases/kernel/syscalls/inotify/inotify03.c
@@ -166,6 +166,7 @@ static void cleanup(void)
}
static struct tst_test test = {
+ .timeout = 1,
.needs_root = 1,
.format_device = 1,
.setup = setup,
diff --git a/testcases/kernel/syscalls/inotify/inotify05.c b/testcases/kernel/syscalls/inotify/inotify05.c
index a1597217f..38b30878c 100644
--- a/testcases/kernel/syscalls/inotify/inotify05.c
+++ b/testcases/kernel/syscalls/inotify/inotify05.c
@@ -148,6 +148,7 @@ static void cleanup(void)
}
static struct tst_test test = {
+ .timeout = 1,
.needs_tmpdir = 1,
.setup = setup,
.cleanup = cleanup,
diff --git a/testcases/kernel/syscalls/inotify/inotify07.c b/testcases/kernel/syscalls/inotify/inotify07.c
index 08ea1e06a..bcfc569a8 100644
--- a/testcases/kernel/syscalls/inotify/inotify07.c
+++ b/testcases/kernel/syscalls/inotify/inotify07.c
@@ -182,6 +182,7 @@ static void cleanup(void)
}
static struct tst_test test = {
+ .timeout = 1,
.needs_root = 1,
.mount_device = 1,
.needs_overlay = 1,
diff --git a/testcases/kernel/syscalls/inotify/inotify08.c b/testcases/kernel/syscalls/inotify/inotify08.c
index 9c2ecdabd..149a0a1f8 100644
--- a/testcases/kernel/syscalls/inotify/inotify08.c
+++ b/testcases/kernel/syscalls/inotify/inotify08.c
@@ -176,6 +176,7 @@ static void cleanup(void)
}
static struct tst_test test = {
+ .timeout = 1,
.needs_root = 1,
.mount_device = 1,
.needs_overlay = 1,
diff --git a/testcases/kernel/syscalls/inotify/inotify11.c b/testcases/kernel/syscalls/inotify/inotify11.c
index 1630477fc..2e571f3a0 100644
--- a/testcases/kernel/syscalls/inotify/inotify11.c
+++ b/testcases/kernel/syscalls/inotify/inotify11.c
@@ -119,6 +119,7 @@ static void cleanup(void)
}
static struct tst_test test = {
+ .timeout = 12,
.needs_tmpdir = 1,
.forks_child = 1,
.cleanup = cleanup,
diff --git a/testcases/kernel/syscalls/ioctl/ioctl02.c b/testcases/kernel/syscalls/ioctl/ioctl02.c
index f3bfb239a..9337da384 100644
--- a/testcases/kernel/syscalls/ioctl/ioctl02.c
+++ b/testcases/kernel/syscalls/ioctl/ioctl02.c
@@ -242,6 +242,7 @@ static void cleanup(void)
}
static struct tst_test test = {
+ .timeout = 9,
.needs_root = 1,
.needs_checkpoints = 1,
.forks_child = 1,
diff --git a/testcases/kernel/syscalls/ioctl/ioctl04.c b/testcases/kernel/syscalls/ioctl/ioctl04.c
index 262c06e97..f96b22f0c 100644
--- a/testcases/kernel/syscalls/ioctl/ioctl04.c
+++ b/testcases/kernel/syscalls/ioctl/ioctl04.c
@@ -84,6 +84,7 @@ static void cleanup(void)
}
static struct tst_test test = {
+ .timeout = 1,
.format_device = 1,
.needs_root = 1,
.setup = setup,
diff --git a/testcases/kernel/syscalls/ioctl/ioctl08.c b/testcases/kernel/syscalls/ioctl/ioctl08.c
index 834c5ae74..14f9354c9 100644
--- a/testcases/kernel/syscalls/ioctl/ioctl08.c
+++ b/testcases/kernel/syscalls/ioctl/ioctl08.c
@@ -118,6 +118,7 @@ static void setup(void)
static struct tst_test test = {
+ .timeout = 1,
.test = verify_ioctl,
.tcnt = ARRAY_SIZE(tcases),
.setup = setup,
diff --git a/testcases/kernel/syscalls/ioctl/ioctl09.c b/testcases/kernel/syscalls/ioctl/ioctl09.c
index 9c7921086..0d1f1072d 100644
--- a/testcases/kernel/syscalls/ioctl/ioctl09.c
+++ b/testcases/kernel/syscalls/ioctl/ioctl09.c
@@ -110,6 +110,7 @@ static void cleanup(void)
}
static struct tst_test test = {
+ .timeout = 1,
.setup = setup,
.cleanup = cleanup,
.test_all = verify_ioctl,
diff --git a/testcases/kernel/syscalls/ioctl/ioctl_ficlone02.c b/testcases/kernel/syscalls/ioctl/ioctl_ficlone02.c
index fab0daaee..e5d4be96f 100644
--- a/testcases/kernel/syscalls/ioctl/ioctl_ficlone02.c
+++ b/testcases/kernel/syscalls/ioctl/ioctl_ficlone02.c
@@ -51,6 +51,7 @@ static void setup(void)
}
static struct tst_test test = {
+ .timeout = 10,
.test_all = run,
.setup = setup,
.min_kver = "4.5",
diff --git a/testcases/kernel/syscalls/ioctl/ioctl_ficlone03.c b/testcases/kernel/syscalls/ioctl/ioctl_ficlone03.c
index f12c4e7fd..b0a0f8d63 100644
--- a/testcases/kernel/syscalls/ioctl/ioctl_ficlone03.c
+++ b/testcases/kernel/syscalls/ioctl/ioctl_ficlone03.c
@@ -101,6 +101,7 @@ static void cleanup(void)
}
static struct tst_test test = {
+ .timeout = 1,
.test = run,
.tcnt = ARRAY_SIZE(tcases),
.setup = setup,
diff --git a/testcases/kernel/syscalls/ioctl/ioctl_ficlonerange01.c b/testcases/kernel/syscalls/ioctl/ioctl_ficlonerange01.c
index 8fd1d299a..707270765 100644
--- a/testcases/kernel/syscalls/ioctl/ioctl_ficlonerange01.c
+++ b/testcases/kernel/syscalls/ioctl/ioctl_ficlonerange01.c
@@ -137,6 +137,7 @@ static void cleanup(void)
}
static struct tst_test test = {
+ .timeout = 1,
.test_all = run,
.setup = setup,
.cleanup = cleanup,
diff --git a/testcases/kernel/syscalls/ioctl/ioctl_ficlonerange02.c b/testcases/kernel/syscalls/ioctl/ioctl_ficlonerange02.c
index eb941c3fc..cc1d0e031 100644
--- a/testcases/kernel/syscalls/ioctl/ioctl_ficlonerange02.c
+++ b/testcases/kernel/syscalls/ioctl/ioctl_ficlonerange02.c
@@ -74,6 +74,7 @@ static void cleanup(void)
}
static struct tst_test test = {
+ .timeout = 4,
.test_all = run,
.setup = setup,
.cleanup = cleanup,
diff --git a/testcases/kernel/syscalls/ioctl/ioctl_loop01.c b/testcases/kernel/syscalls/ioctl/ioctl_loop01.c
index e7b337e4a..c3fb9f583 100644
--- a/testcases/kernel/syscalls/ioctl/ioctl_loop01.c
+++ b/testcases/kernel/syscalls/ioctl/ioctl_loop01.c
@@ -140,6 +140,7 @@ static void cleanup(void)
}
static struct tst_test test = {
+ .timeout = 1,
.setup = setup,
.cleanup = cleanup,
.test_all = verify_ioctl_loop,
--
2.45.2
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [LTP] [PATCH 1/2] scripts: Add simple script for calculating timeouts
2025-01-21 12:34 ` [LTP] [PATCH 1/2] scripts: Add simple script for calculating timeouts Cyril Hrubis
@ 2025-01-21 13:12 ` Andrea Cervesato via ltp
2025-01-21 14:26 ` Cyril Hrubis
0 siblings, 1 reply; 8+ messages in thread
From: Andrea Cervesato via ltp @ 2025-01-21 13:12 UTC (permalink / raw)
To: Cyril Hrubis, ltp
Hi!
I like the general idea, a couple of comments on the python code.
On 1/21/25 13:34, Cyril Hrubis wrote:
> This script parses JSON results from kirk and LTP metadata in order
> calculate timeouts for tests based on the result file and can even patch
> tests automatically.
>
> The script does:
>
> - Take the results and pick all tests that run for longer than 0.5s.
> Multiplies the time with a constant (currently 1.2) to get a suggested
> timeout.
>
> - Exclude tests that have runtime defined since these are controller
> by the runtime (that filters out all fuzzy sync tests).
>
> There is a special case for timer tests that define runtime only
> dynamically in the timer library code. This should be possibly fixed
> with special value for the .runtime in tst_test. E.g.
> TST_RUNTIME_DYNAMIC for tests that only set runtime in the setup.
>
> - Normalize the timeout per a single filesystem run if test is running for
> more than one filesystem.
>
> - Tests that do not have a metadata record are old library tests which
> which cannot be patched but are printed in a separate table if we
> request a table to be printed.
>
> - If patching option is selected tests are update with newly calculated
> timeout. By default we only increase timeouts but that can be
> overrided with the -o option.
>
> Signed-off-by: Cyril Hrubis <chrubis@suse.cz>
> ---
> scripts/calc_timeouts.py | 133 +++++++++++++++++++++++++++++++++++++++
> 1 file changed, 133 insertions(+)
> create mode 100755 scripts/calc_timeouts.py
>
> diff --git a/scripts/calc_timeouts.py b/scripts/calc_timeouts.py
> new file mode 100755
> index 000000000..c69ab8f57
> --- /dev/null
> +++ b/scripts/calc_timeouts.py
> @@ -0,0 +1,133 @@
> +#!/usr/bin/python
> +import re
> +import json
> +import getopt
> +import sys
> +from os import system
> +
> +# Top level directory path
> +top_dir = '../'
Better to pass this folder to the script using parameters, also because
metadata can be found in the install folder as well.
> +
> +# The test runtime is multiplied by this to get a timeout
> +timeout_mul = 1.2
Global variables in python use TIMEOUT_MUL format.
> +
> +def patch(fname, new_timeout, patch_override):
> +
> + orig_timeout = None
> + file_path = top_dir + fname
os.path.join()
> +
> + with open(file_path, 'r') as c_source:
> + for line in c_source:
> + timeout = re.search(r'\s*.timeout\s*=\s*(\d+).', line)
This regex should be compiled before loop using re.compile(), otherwise
re.search() will compile it for each line.
> + if timeout:
> + orig_timeout = int(timeout.group(1))
> +
> + if orig_timeout:
> + if orig_timeout < new_timeout or patch_override:
> + print("CHANGE %s timeout %i -> %i" % (fname, orig_timeout, new_timeout))
> + system("sed -i 's/\\.timeout = [0-9]*/\\.timeout = " + str(new_timeout) + "/' " + file_path)
This can be substituted with a python version of sed, since system() is
never a good idea, unless we really need to use it for external tools
which cannot be translated into python. The solution would be:
content = []
matcher = re.match(r'\s*.timeout\s*=\s*(\d+).')
with open(file_path, 'r') as data:
for line in data:
# use regex here to find the matching string
if matcher.search(line):
content.append(f'timeout = {new_timeout}')
else:
content.append(line)
with open(file_path, 'w') as data:
data.writelines(content)
> + else:
> + print("KEEP %s timeout %i (new %i)" % (fname, orig_timeout, new_timeout))
> + else:
> + print("ADD %s timeout %i" % (fname, new_timeout))
> + system("sed -i '/static struct tst_test test = {/a\\\\t.timeout = " + str(new_timeout) + ",' " + file_path)
Same here. Maybe we can create a generic sed() function for both cases.
> +
> +def patch_all(timeouts, patch_override):
> + for timeout in timeouts:
> + if timeout[3]:
> + patch(timeout[3], timeout[1], patch_override)
> +
> +def print_table(timeouts):
> + timeouts.sort(key=lambda x: x[1], reverse=True)
> +
> + total = 0;
> +
> + print("Old library tests\n-----------------\n");
> + for timeout in timeouts:
> + if not timeout[2]:
> + print("%-30s %i" % (timeout[0], timeout[1]))
> + total+=1
> +
> + print("\n\t%i tests in total" % total)
> +
> + total = 0;
> +
> + print("\nNew library tests\n-----------------\n");
> + for timeout in timeouts:
> + if timeout[2]:
> + print("%-30s %i" % (timeout[0], timeout[1]))
> + total+=1
> +
> + print("\n\t%i tests in total" % total)
> +
> +def parse_data(results_path):
> + timeouts = []
> +
> + with open(results_path, 'r') as file:
> + results = json.load(file)
> +
> + with open(top_dir + 'metadata/ltp.json', 'r') as file:
> + metadata = json.load(file)
> +
> + for test in results['results']:
> + name = test['test_fqn']
> + duration = test['test']['duration']
> + # If test runs for all_filesystems normalize the runtime per a single filesystem
> + filesystems = max(1, test['test']['log'].count('TINFO: Formatting /'))
> + # Check if test is new library test
> + test_is_newlib = name in metadata['tests']
> + # Store test file path
> + path = None if not test_is_newlib else metadata['tests'][name]['fname']
> + # Filter out tests with runtime
> + test_has_runtime = False if not test_is_newlib else 'runtime' in metadata['tests'][name]
> + # Timer tests define runtime dynamically in timer library
> + if test_is_newlib and 'sample' in metadata['tests'][name]:
> + test_has_runtime = True
> + # Select tests that does not have runtime and are executed for longer time
> + if not test_has_runtime and duration >= 0.5:
> + timeouts.append((name, int(timeout_mul * duration/filesystems + 0.5), test_is_newlib, path))
> +
> + return timeouts
In this case it's better to avoid tuples because they make code more
difficult to read. Hash is a better approach in general:
data["name"] = name
data["timeout"] = int(timeout_mul * duration/filesystems + 0.5)
data["new_lib"] = test_is_newlib
data["path"] = path
return data
> +
> +def print_help():
> + print('calc_timeouts.py [OPTION] [RESULT].json')
> + print('\t-h prints this help')
> + print('\t-o override test timeouts, by default timeouts are only increased')
> + print('\t-p patch testcases with updated timeouts')
> + print('\t-t prints table of tests with suggested timeouts')
> +
> +try:
> + opts, args = getopt.getopt(sys.argv[1:], "hopt")
> +except:
> + print_help()
> + sys.exit(1)
> +
> +opt_print_table = False
> +opt_patch_tests = False
> +opt_patch_override = False
> +
> +for opt,arg in opts:
> + if opt == '-h':
> + print_help()
> + sys.exit(0)
> + if opt == '-o':
> + opt_patch_override = True
> + if opt == '-p':
> + opt_patch_tests = True
> + if opt == '-t':
> + opt_print_table = True
> +
> +if not opt_print_table and not opt_patch_tests:
> + print("No action selected!\n")
> + print_help()
> + sys.exit(1)
> +
> +results = args[0] if args else 'results.json'
> +
> +timeouts = parse_data(results)
> +
> +if opt_print_table:
> + print_table(timeouts)
> +
> +if opt_patch_tests:
> + patch_all(timeouts, opt_patch_override)
Better to wrap everything into a main() function and to use:
if __name__ == "__main__":
run()
Andrea
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [LTP] [PATCH 1/2] scripts: Add simple script for calculating timeouts
2025-01-21 13:12 ` Andrea Cervesato via ltp
@ 2025-01-21 14:26 ` Cyril Hrubis
2025-01-21 14:32 ` Andrea Cervesato via ltp
0 siblings, 1 reply; 8+ messages in thread
From: Cyril Hrubis @ 2025-01-21 14:26 UTC (permalink / raw)
To: Andrea Cervesato; +Cc: ltp
Hi!
> I like the general idea, a couple of comments on the python code.
Feel free to push the script with the changes you suggested, you are the
python expert here after all.
--
Cyril Hrubis
chrubis@suse.cz
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [LTP] [PATCH 1/2] scripts: Add simple script for calculating timeouts
2025-01-21 14:26 ` Cyril Hrubis
@ 2025-01-21 14:32 ` Andrea Cervesato via ltp
0 siblings, 0 replies; 8+ messages in thread
From: Andrea Cervesato via ltp @ 2025-01-21 14:32 UTC (permalink / raw)
To: Cyril Hrubis; +Cc: ltp
Sure I can do that
On 1/21/25 15:26, Cyril Hrubis wrote:
> Hi!
>> I like the general idea, a couple of comments on the python code.
> Feel free to push the script with the changes you suggested, you are the
> python expert here after all.
>
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 8+ messages in thread
* [LTP] [PATCH 1/2] scripts: Add simple script for calculating timeouts
2025-01-22 12:48 [LTP] [PATCH 0/2] Update test timeouts in an automated way Andrea Cervesato
@ 2025-01-22 12:48 ` Andrea Cervesato
2025-01-22 13:13 ` Cyril Hrubis
0 siblings, 1 reply; 8+ messages in thread
From: Andrea Cervesato @ 2025-01-22 12:48 UTC (permalink / raw)
To: ltp
From: Cyril Hrubis <chrubis@suse.cz>
This script parses JSON results from kirk and LTP metadata in order
calculate timeouts for tests based on the result file. It can also patch
tests automatically.
The script does:
- Take the results and pick all tests that run for longer than 0.5s.
Multiplie the time with a constant (currently 1.2) to get a suggested
timeout.
- Exclude tests that have runtime defined since these are controlled
by the runtime (that filters out all fuzzy sync tests).
There is a special case for timer tests that defines runtime only
dynamically in the timer library code. This should be possibly fixed
with special value for the .runtime in tst_test. E.g.
TST_RUNTIME_DYNAMIC for tests that only set runtime in the setup.
- Normalize the timeout for a single filesystem run if test is running for
more than one filesystem.
- Verify if tests are build on top of old library by checking at
metadata file
- Update test with a with newly calculated timeout.
By default we only increase timeouts but that can be overridden using
the -o option.
Signed-off-by: Cyril Hrubis <chrubis@suse.cz>
Co-developed-by: Andrea Cervesato <andrea.cervesato@suse.com>
Signed-off-by: Andrea Cervesato <andrea.cervesato@suse.com>
---
scripts/calctimeouts.py | 232 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 232 insertions(+)
diff --git a/scripts/calctimeouts.py b/scripts/calctimeouts.py
new file mode 100755
index 0000000000000000000000000000000000000000..d5e8fe2c15faad7c8d1ec8c15541f35a97a8c0c4
--- /dev/null
+++ b/scripts/calctimeouts.py
@@ -0,0 +1,232 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: GPL-2.0-or-later
+"""
+This script parses JSON results from kirk and LTP metadata in order to
+calculate timeouts for tests based on the results file.
+It can also patch tests automatically and replace the calculated timeout.
+"""
+
+import re
+import os
+import json
+import argparse
+
+# The test runtime is multiplied by this to get a timeout
+TIMEOUT_MUL = 1.2
+
+
+def _sed(fname, expr, replace):
+ """
+ Pythonic version of sed command.
+ """
+ content = []
+ matcher = re.compile(expr)
+
+ with open(fname, 'r', encoding="utf-8") as data:
+ for line in data:
+ match = matcher.search(line)
+ if not match:
+ content.append(line)
+ else:
+ content.append(replace)
+
+ with open(fname, 'w', encoding="utf-8") as data:
+ data.writelines(content)
+
+
+def _patch(ltp_dir, fname, new_timeout, override):
+ """
+ If `override` is True, it patches a test file, searching for timeout and
+ replacing it with `new_timeout`.
+ """
+ orig_timeout = None
+ file_path = os.path.join(ltp_dir, fname)
+
+ with open(file_path, 'r', encoding="utf-8") as c_source:
+ matcher = re.compile(r'\s*.timeout\s*=\s*(\d+).')
+ for line in c_source:
+ match = matcher.search(line)
+ if not match:
+ continue
+
+ timeout = match.group(1)
+ orig_timeout = int(timeout)
+
+ if orig_timeout:
+ if orig_timeout < new_timeout and override:
+ print(f"CHANGE {fname} timeout {orig_timeout} -> {new_timeout}")
+ _sed(file_path, r".timeout = [0-9]*,\n",
+ f"\t.timeout = {new_timeout},\n")
+ else:
+ print(f"KEEP {fname} timeout {orig_timeout} (new {new_timeout})")
+ else:
+ print(f"ADD {fname} timeout {new_timeout}")
+ _sed(file_path,
+ "static struct tst_test test = {",
+ "static struct tst_test test = {\n"
+ f"\t.timeout = {new_timeout},\n")
+
+
+def _patch_all(ltp_dir, timeouts, override):
+ """
+ Patch all tests.
+ """
+ for timeout in timeouts:
+ if timeout['path']:
+ _patch(ltp_dir, timeout['path'], timeout['timeout'], override)
+
+
+def _print_table(timeouts):
+ """
+ Print the timeouts table.
+ """
+ timeouts.sort(key=lambda x: x['timeout'], reverse=True)
+
+ total = 0
+
+ print("Old library tests\n-----------------\n")
+ for timeout in timeouts:
+ if not timeout['newlib']:
+ print(f"{timeout['name']:30s} {timeout['timeout']}")
+ total += 1
+
+ print(f"\n\t{total} tests in total")
+
+ total = 0
+
+ print("\nNew library tests\n-----------------\n")
+ for timeout in timeouts:
+ if timeout['newlib']:
+ print(f"{timeout['name']:30s} {timeout['timeout']}")
+ total += 1
+
+ print(f"\n\t{total} tests in total")
+
+
+def _parse_data(ltp_dir, results_path):
+ """
+ Parse results data and metadata, then it generates timeouts data.
+ """
+ timeouts = []
+ results = None
+ metadata = None
+
+ with open(results_path, 'r', encoding="utf-8") as file:
+ results = json.load(file)
+
+ metadata_path = os.path.join(ltp_dir, 'metadata', 'ltp.json')
+ with open(metadata_path, 'r', encoding="utf-8") as file:
+ metadata = json.load(file)
+
+ for test in results['results']:
+ name = test['test_fqn']
+ duration = test['test']['duration']
+
+ # if test runs for all_filesystems, normalize runtime to one filesystem
+ filesystems = max(1, test['test']['log'].count('TINFO: Formatting /'))
+
+ # check if test is new library test
+ test_is_newlib = name in metadata['tests']
+
+ # store test file path
+ path = None
+ if test_is_newlib:
+ path = metadata['tests'][name]['fname']
+
+ test_has_runtime = False
+ if test_is_newlib:
+ # filter out tests with runtime
+ test_has_runtime = 'runtime' in metadata['tests'][name]
+
+ # timer tests define runtime dynamically in timer library
+ test_has_runtime = 'sample' in metadata['tests'][name]
+
+ # select tests that does not have runtime and which are executed
+ # for a long time
+ if not test_has_runtime and duration >= 0.5:
+ data = {}
+ data["name"] = name
+ data["timeout"] = int(TIMEOUT_MUL * duration/filesystems + 0.5)
+ data["newlib"] = test_is_newlib
+ data["path"] = path
+
+ timeouts.append(data)
+
+ return timeouts
+
+
+def _file_exists(filepath):
+ """
+ Check if the given file path exists.
+ """
+ if not os.path.isfile(filepath):
+ raise argparse.ArgumentTypeError(
+ f"The file '{filepath}' does not exist.")
+ return filepath
+
+
+def _dir_exists(dirpath):
+ """
+ Check if the given directory path exists.
+ """
+ if not os.path.isdir(dirpath):
+ raise argparse.ArgumentTypeError(
+ f"The directory '{dirpath}' does not exist.")
+ return dirpath
+
+
+def run():
+ """
+ Entry point of the script.
+ """
+ parser = argparse.ArgumentParser(
+ description="Script to calculate LTP tests timeouts")
+
+ parser.add_argument(
+ '-l',
+ '--ltp-dir',
+ type=_dir_exists,
+ help='LTP directory',
+ default='/opt/ltp')
+
+ parser.add_argument(
+ '-r',
+ '--results',
+ type=_file_exists,
+ required=True,
+ help='kirk results.json file location')
+
+ parser.add_argument(
+ '-o',
+ '--override',
+ default=False,
+ action='store_true',
+ help='Override test timeouts')
+
+ parser.add_argument(
+ '-p',
+ '--patch',
+ default=False,
+ action='store_true',
+ help='Patch tests with updated timeout')
+
+ parser.add_argument(
+ '-t',
+ '--print-table',
+ default=True,
+ action='store_true',
+ help='Print table with suggested timeouts')
+
+ args = parser.parse_args()
+
+ timeouts = _parse_data(args.ltp_dir, args.results)
+
+ if args.print_table:
+ _print_table(timeouts)
+
+ if args.patch:
+ _patch_all(args.ltp_dir, timeouts, args.override)
+
+
+if __name__ == "__main__":
+ run()
--
2.43.0
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [LTP] [PATCH 1/2] scripts: Add simple script for calculating timeouts
2025-01-22 12:48 ` [LTP] [PATCH 1/2] scripts: Add simple script for calculating timeouts Andrea Cervesato
@ 2025-01-22 13:13 ` Cyril Hrubis
0 siblings, 0 replies; 8+ messages in thread
From: Cyril Hrubis @ 2025-01-22 13:13 UTC (permalink / raw)
To: Andrea Cervesato; +Cc: ltp
Hi!
> This script parses JSON results from kirk and LTP metadata in order
> calculate timeouts for tests based on the result file. It can also patch
> tests automatically.
>
> The script does:
>
> - Take the results and pick all tests that run for longer than 0.5s.
> Multiplie the time with a constant (currently 1.2) to get a suggested
> timeout.
>
> - Exclude tests that have runtime defined since these are controlled
> by the runtime (that filters out all fuzzy sync tests).
>
> There is a special case for timer tests that defines runtime only
> dynamically in the timer library code. This should be possibly fixed
> with special value for the .runtime in tst_test. E.g.
> TST_RUNTIME_DYNAMIC for tests that only set runtime in the setup.
>
> - Normalize the timeout for a single filesystem run if test is running for
> more than one filesystem.
>
> - Verify if tests are build on top of old library by checking at
> metadata file
>
> - Update test with a with newly calculated timeout.
> By default we only increase timeouts but that can be overridden using
> the -o option.
>
> Signed-off-by: Cyril Hrubis <chrubis@suse.cz>
> Co-developed-by: Andrea Cervesato <andrea.cervesato@suse.com>
> Signed-off-by: Andrea Cervesato <andrea.cervesato@suse.com>
> ---
> scripts/calctimeouts.py | 232 ++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 232 insertions(+)
>
> diff --git a/scripts/calctimeouts.py b/scripts/calctimeouts.py
> new file mode 100755
> index 0000000000000000000000000000000000000000..d5e8fe2c15faad7c8d1ec8c15541f35a97a8c0c4
> --- /dev/null
> +++ b/scripts/calctimeouts.py
> @@ -0,0 +1,232 @@
> +#!/usr/bin/env python3
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +"""
> +This script parses JSON results from kirk and LTP metadata in order to
> +calculate timeouts for tests based on the results file.
> +It can also patch tests automatically and replace the calculated timeout.
> +"""
> +
> +import re
> +import os
> +import json
> +import argparse
> +
> +# The test runtime is multiplied by this to get a timeout
> +TIMEOUT_MUL = 1.2
> +
> +
> +def _sed(fname, expr, replace):
> + """
> + Pythonic version of sed command.
> + """
> + content = []
> + matcher = re.compile(expr)
> +
> + with open(fname, 'r', encoding="utf-8") as data:
> + for line in data:
> + match = matcher.search(line)
> + if not match:
> + content.append(line)
> + else:
> + content.append(replace)
> +
> + with open(fname, 'w', encoding="utf-8") as data:
> + data.writelines(content)
> +
> +
> +def _patch(ltp_dir, fname, new_timeout, override):
> + """
> + If `override` is True, it patches a test file, searching for timeout and
> + replacing it with `new_timeout`.
The override is for the cases where the test already has a timeout and
the timeout in the test is bigger than the one we calculated. By default
the function keeps the bigger timeout.
> + """
> + orig_timeout = None
> + file_path = os.path.join(ltp_dir, fname)
> +
> + with open(file_path, 'r', encoding="utf-8") as c_source:
> + matcher = re.compile(r'\s*.timeout\s*=\s*(\d+).')
> + for line in c_source:
> + match = matcher.search(line)
> + if not match:
> + continue
> +
> + timeout = match.group(1)
> + orig_timeout = int(timeout)
> +
> + if orig_timeout:
> + if orig_timeout < new_timeout and override:
> + print(f"CHANGE {fname} timeout {orig_timeout} -> {new_timeout}")
> + _sed(file_path, r".timeout = [0-9]*,\n",
> + f"\t.timeout = {new_timeout},\n")
> + else:
> + print(f"KEEP {fname} timeout {orig_timeout} (new {new_timeout})")
> + else:
> + print(f"ADD {fname} timeout {new_timeout}")
> + _sed(file_path,
> + "static struct tst_test test = {",
> + "static struct tst_test test = {\n"
> + f"\t.timeout = {new_timeout},\n")
> +
> +
> +def _patch_all(ltp_dir, timeouts, override):
> + """
> + Patch all tests.
> + """
> + for timeout in timeouts:
> + if timeout['path']:
> + _patch(ltp_dir, timeout['path'], timeout['timeout'], override)
> +
> +
> +def _print_table(timeouts):
> + """
> + Print the timeouts table.
> + """
> + timeouts.sort(key=lambda x: x['timeout'], reverse=True)
> +
> + total = 0
> +
> + print("Old library tests\n-----------------\n")
> + for timeout in timeouts:
> + if not timeout['newlib']:
> + print(f"{timeout['name']:30s} {timeout['timeout']}")
> + total += 1
> +
> + print(f"\n\t{total} tests in total")
> +
> + total = 0
> +
> + print("\nNew library tests\n-----------------\n")
> + for timeout in timeouts:
> + if timeout['newlib']:
> + print(f"{timeout['name']:30s} {timeout['timeout']}")
> + total += 1
> +
> + print(f"\n\t{total} tests in total")
> +
> +
> +def _parse_data(ltp_dir, results_path):
> + """
> + Parse results data and metadata, then it generates timeouts data.
> + """
> + timeouts = []
> + results = None
> + metadata = None
> +
> + with open(results_path, 'r', encoding="utf-8") as file:
> + results = json.load(file)
> +
> + metadata_path = os.path.join(ltp_dir, 'metadata', 'ltp.json')
> + with open(metadata_path, 'r', encoding="utf-8") as file:
> + metadata = json.load(file)
> +
> + for test in results['results']:
> + name = test['test_fqn']
> + duration = test['test']['duration']
> +
> + # if test runs for all_filesystems, normalize runtime to one filesystem
> + filesystems = max(1, test['test']['log'].count('TINFO: Formatting /'))
> +
> + # check if test is new library test
> + test_is_newlib = name in metadata['tests']
> +
> + # store test file path
> + path = None
> + if test_is_newlib:
> + path = metadata['tests'][name]['fname']
> +
> + test_has_runtime = False
> + if test_is_newlib:
> + # filter out tests with runtime
> + test_has_runtime = 'runtime' in metadata['tests'][name]
> +
> + # timer tests define runtime dynamically in timer library
> + test_has_runtime = 'sample' in metadata['tests'][name]
> +
> + # select tests that does not have runtime and which are executed
> + # for a long time
> + if not test_has_runtime and duration >= 0.5:
> + data = {}
> + data["name"] = name
> + data["timeout"] = int(TIMEOUT_MUL * duration/filesystems + 0.5)
> + data["newlib"] = test_is_newlib
> + data["path"] = path
> +
> + timeouts.append(data)
> +
> + return timeouts
> +
> +
> +def _file_exists(filepath):
> + """
> + Check if the given file path exists.
> + """
> + if not os.path.isfile(filepath):
> + raise argparse.ArgumentTypeError(
> + f"The file '{filepath}' does not exist.")
> + return filepath
> +
> +
> +def _dir_exists(dirpath):
> + """
> + Check if the given directory path exists.
> + """
> + if not os.path.isdir(dirpath):
> + raise argparse.ArgumentTypeError(
> + f"The directory '{dirpath}' does not exist.")
> + return dirpath
> +
> +
> +def run():
> + """
> + Entry point of the script.
> + """
> + parser = argparse.ArgumentParser(
> + description="Script to calculate LTP tests timeouts")
> +
> + parser.add_argument(
> + '-l',
> + '--ltp-dir',
> + type=_dir_exists,
> + help='LTP directory',
> + default='/opt/ltp')
The script is not supposed to be executed from installed tree, it needs
the C source files. So I would argue that '../' or '.' is better
default.
> + parser.add_argument(
> + '-r',
> + '--results',
> + type=_file_exists,
> + required=True,
> + help='kirk results.json file location')
> +
> + parser.add_argument(
> + '-o',
> + '--override',
> + default=False,
> + action='store_true',
> + help='Override test timeouts')
> +
> + parser.add_argument(
> + '-p',
> + '--patch',
> + default=False,
> + action='store_true',
> + help='Patch tests with updated timeout')
> +
> + parser.add_argument(
> + '-t',
> + '--print-table',
> + default=True,
> + action='store_true',
> + help='Print table with suggested timeouts')
> +
> + args = parser.parse_args()
> +
> + timeouts = _parse_data(args.ltp_dir, args.results)
> +
> + if args.print_table:
> + _print_table(timeouts)
> +
> + if args.patch:
> + _patch_all(args.ltp_dir, timeouts, args.override)
> +
> +
> +if __name__ == "__main__":
> + run()
>
> --
> 2.43.0
>
--
Cyril Hrubis
chrubis@suse.cz
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2025-01-22 13:13 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-01-21 12:34 [LTP] [PATCH 0/2] Update test timeouts in an automated way Cyril Hrubis
2025-01-21 12:34 ` [LTP] [PATCH 1/2] scripts: Add simple script for calculating timeouts Cyril Hrubis
2025-01-21 13:12 ` Andrea Cervesato via ltp
2025-01-21 14:26 ` Cyril Hrubis
2025-01-21 14:32 ` Andrea Cervesato via ltp
2025-01-21 12:34 ` [LTP] [PATCH 2/2] syscalls: Update test timeouts Cyril Hrubis
-- strict thread matches above, loose matches on Subject: below --
2025-01-22 12:48 [LTP] [PATCH 0/2] Update test timeouts in an automated way Andrea Cervesato
2025-01-22 12:48 ` [LTP] [PATCH 1/2] scripts: Add simple script for calculating timeouts Andrea Cervesato
2025-01-22 13:13 ` Cyril Hrubis
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox