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