greybus: loopback: Fix averaging
authorAlexandre Bailon <abailon@baylibre.com>
Thu, 25 Feb 2016 17:19:16 +0000 (18:19 +0100)
committerGreg Kroah-Hartman <gregkh@google.com>
Fri, 26 Feb 2016 01:05:31 +0000 (17:05 -0800)
Currently, we are adding 0.5 to the average to round the average.
But we are using the remainder to calculate the decimal, so we do not
need to round the average.
In addition, use a u64 type for the remainder to avoid overflow
that might happen when stats->sum value is too big,
usually for requests per seconds and the throughput.

Signed-off-by: Alexandre Bailon <abailon@baylibre.com>
Reviewed-by: Johan Hovold <johan@hovoldconsulting.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
drivers/staging/greybus/loopback.c

index 85d3e35e6a5f92e84f27ab658c8ff0d5b339cb2e..9f0da577d842f2f94f03814adef079386c23bb6f 100644 (file)
@@ -157,14 +157,15 @@ static ssize_t name##_avg_show(struct device *dev,                \
 {                                                                      \
        struct gb_loopback_stats *stats;                                \
        struct gb_loopback *gb;                                         \
-       u64 avg;                                                        \
-       u32 count, rem;                                                 \
+       u64 avg, rem;                                                   \
+       u32 count;                                                      \
        gb = dev_get_drvdata(dev);                      \
        stats = &gb->name;                                      \
        count = stats->count ? stats->count : 1;                        \
-       avg = stats->sum + count / 2;   /* round closest */             \
+       avg = stats->sum;                                               \
        rem = do_div(avg, count);                                       \
-       return sprintf(buf, "%llu.%06u\n", avg, 1000000 * rem / count); \
+       rem = 1000000 * rem / count;                                    \
+       return sprintf(buf, "%llu.%06u\n", avg, (u32)rem);              \
 }                                                                      \
 static DEVICE_ATTR_RO(name##_avg)