[PATCH] Fix cyclictest negative durations

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



When the next interval is too far in the future, then now < next, and the
elapsed time calcdiff(now, next) is negative. If such a situation occurs, it is
obvious the calculation of the next interval was wrong, and we rewind it until
we find a positive value.

This bug can be reproduced by setting a very short interval, such as 1us:

Without the patch:
  ./cyclictest -i 1
  T: 0 ( 8429) P: 0 I:1 C:1099294 Min:      0 Act:  -34 Avg:-9223372036854775808 Max:      -1

With the patch:
  ./cyclictest -i 1
  T: 0 ( 8665) P: 0 I:1 C: 419151 Min:      0 Act:    0 Avg:    0 Max:      76

Signed-off-by: Francis Giraldeau <francis.giraldeau@xxxxxxxxx>
---
 src/cyclictest/cyclictest.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/src/cyclictest/cyclictest.c b/src/cyclictest/cyclictest.c
index 34053c5..151b0eb 100644
--- a/src/cyclictest/cyclictest.c
+++ b/src/cyclictest/cyclictest.c
@@ -914,6 +914,16 @@ void *timerthread(void *param)
 			goto out;
 		}
 
+		// the next interval was too far in the future, rewind it
+		while (calcdiff_ns(now, next) < 0) {
+			next.tv_sec -= interval.tv_sec;
+			next.tv_nsec -= interval.tv_nsec;
+			if (next.tv_nsec < 0) {
+				next.tv_sec--;
+				next.tv_nsec += NSEC_PER_SEC;
+			}
+		}
+
 		if (use_nsecs)
 			diff = calcdiff_ns(now, next);
 		else
-- 
2.7.4

--
To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [RT Stable]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]

  Powered by Linux