greybus: loopback: handle timestamp roll-over
authorBryan O'Donoghue <bryan.odonoghue@linaro.org>
Tue, 11 Aug 2015 12:50:54 +0000 (13:50 +0100)
committerGreg Kroah-Hartman <gregkh@google.com>
Wed, 12 Aug 2015 03:06:58 +0000 (20:06 -0700)
This patch ensures we account for roll-over in the loopback driver.
do_gettimeofday() is used to grab a timestamp. Two timestamps are derived
one before and one after a gb_operation_sync(), however since
do_gettimeofday() returns the number of seconds and mircoseconds that have
elapsed today - we need to account for a situation where the timestamp
starts at say 23:59:999us rolls over and the end time is now earlier than
the start time.

Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
drivers/staging/greybus/loopback.c

index ac38644c4a4818e6e0fe822b5af3e1da8a53cb5d..852b6beaecac1a0c3e80390b6a14fbb00b0b23a3 100644 (file)
@@ -22,6 +22,8 @@
 
 #include "greybus.h"
 
+#define NSEC_PER_DAY 86400000000000ULL
+
 struct gb_loopback_stats {
        u32 min;
        u32 max;
@@ -226,7 +228,10 @@ static void gb_loopback_calc_latency(struct gb_loopback *gb,
 
        t1 = timeval_to_ns(ts);
        t2 = timeval_to_ns(te);
-       gb->elapsed_nsecs = t2 - t1;
+       if (t2 > t1)
+               gb->elapsed_nsecs = t2 - t1;
+       else
+               gb->elapsed_nsecs = NSEC_PER_DAY - t2 + t1;
 }
 
 static int gb_loopback_sink(struct gb_loopback *gb, u32 len)