greybus: loopback: timestamp seeding should not drop metrics
authorBryan O'Donoghue <bryan.odonoghue@linaro.org>
Tue, 21 Jul 2015 22:50:06 +0000 (23:50 +0100)
committerGreg Kroah-Hartman <gregkh@google.com>
Wed, 22 Jul 2015 17:46:53 +0000 (10:46 -0700)
In the current code if the ts variable is not initialized then any data
already gathered in a previous loopback command is dropped instead of
logged. Also the timestamping of ts is done after the greybus operation.

This delayed time-stamping means that the delta between the before and
after timestamps is incorrect and if a delay in-between loopback operations
has been specified by the user, the ts timestamp will be very skewed
indeed.

- Move the ts initialization directly before the greybus operation.
- Remove the continue statement on first initialization of the ts variable.

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 fe3a57b..2de939f 100644 (file)
@@ -394,6 +394,8 @@ static int gb_loopback_fn(void *data)
                        msleep(1000);
                        continue;
                }
+               if (gb->ts.tv_usec == 0 && gb->ts.tv_sec == 0)
+                       do_gettimeofday(&gb->ts);
                if (gb->type == GB_LOOPBACK_TYPE_PING)
                        error = gb_loopback_ping(gb, &tlat);
                else if (gb->type == GB_LOOPBACK_TYPE_TRANSFER)
@@ -402,10 +404,6 @@ static int gb_loopback_fn(void *data)
                        error = gb_loopback_sink(gb, &tlat, gb->size);
                if (error)
                        gb->error++;
-               if (gb->ts.tv_usec == 0 && gb->ts.tv_sec == 0) {
-                       do_gettimeofday(&gb->ts);
-                       continue;
-               }
                do_gettimeofday(&gb->te);
                gb->elapsed_nsecs = timeval_to_ns(&gb->te) -
                                        timeval_to_ns(&gb->ts);