aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Stancek <jstancek@redhat.com>2021-07-23 14:24:52 +0200
committerEdward Liaw <edliaw@google.com>2024-01-05 00:33:52 +0000
commit316222cbcd698f6236fcceadb16d3d1e491e8c04 (patch)
tree6426a314340bc0c58206740fecf5851e0dab7e56
parentce111536994e37f470fbe5dc4c425baaffe87057 (diff)
downloadltp-316222cbcd698f6236fcceadb16d3d1e491e8c04.tar.gz
clock_gettime01: avoid zero exec runtime due to irq and steal time accountingandroid13-tests-dev
Test is sporadically failing on KVM guests with zero-ed timespec returned by CLOCK_{PROCESS,THREAD}_CPUTIME_ID. This can be reproduced on kernels v4.18 and v5.13-rc3 which have IRQ and PARAVIRT TIME ACCOUNTING enabled. Task exectime is usually updated on call of clock_gettime(). But update_rq_clock_task() may not update clock_task if there's more unaccounted irq or steal time than rq->clock delta since last call. In this instance rq->clock_task does not advance and it is left for next update to account rest. Because LTP test is quick and checks only once, it sometimes sees zero timespec and treats it as failure. Add a small warm-up to setup() in form of busy loop, to make sure that clock_task advanced. In case of bug we would either hit a timeout or still report zeroed timespec. Signed-off-by: Jan Stancek <jstancek@redhat.com> Reviewed-by: Cyril Hrubis <chrubis@suse.cz> (cherry picked from commit 783164765c77cb1180e285e495e51eb60186ece5) Bug: 193878093 Test: atest -a vts_ltp_test_x86_64:syscalls.clock_gettime01_64bit Change-Id: Iebfe4e42d46ea62f9bdfb699cf82ee2355c5fd60 Merged-In: Iecd9f56d8980a8fe0db7d70f2a276de5a2503908 Signed-off-by: Edward Liaw <edliaw@google.com>
-rw-r--r--testcases/kernel/syscalls/clock_gettime/clock_gettime01.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/testcases/kernel/syscalls/clock_gettime/clock_gettime01.c b/testcases/kernel/syscalls/clock_gettime/clock_gettime01.c
index be9573afc..11da39cf0 100644
--- a/testcases/kernel/syscalls/clock_gettime/clock_gettime01.c
+++ b/testcases/kernel/syscalls/clock_gettime/clock_gettime01.c
@@ -73,7 +73,15 @@ static struct time64_variants variants[] = {
static void setup(void)
{
+ long unsigned utime;
+
tst_res(TINFO, "Testing variant: %s", variants[tst_variant].desc);
+
+ do {
+ SAFE_FILE_SCANF("/proc/self/stat",
+ "%*d %*s %*c %*d %*d %*d %*d %*d %*u %*u %*u %*u %*u %lu",
+ &utime);
+ } while (utime == 0);
}
static void verify_clock_gettime(unsigned int i)
@@ -118,4 +126,5 @@ static struct tst_test test = {
.test_variants = ARRAY_SIZE(variants),
.setup = setup,
.needs_root = 1,
+ .timeout = 10,
};