From 0caf72811441b42cb14a28c72007f8ef35b453d6 Mon Sep 17 00:00:00 2001 From: Remy Horton Date: Wed, 19 Apr 2017 14:26:48 +0100 Subject: [PATCH] bitrate: fix integer roundoff In the absence of traffic, it is possible for the bitrate moving average to get stuck at a non-zero value, due to the calculated delta being less than what an integer can represent. Fixes: 2ad7ba9a6567 ("bitrate: add bitrate statistics library") Signed-off-by: Remy Horton --- lib/librte_bitratestats/rte_bitrate.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/librte_bitratestats/rte_bitrate.c b/lib/librte_bitratestats/rte_bitrate.c index 260750fe84..193aa690ed 100644 --- a/lib/librte_bitratestats/rte_bitrate.c +++ b/lib/librte_bitratestats/rte_bitrate.c @@ -118,6 +118,11 @@ rte_stats_bitrate_calc(struct rte_stats_bitrates *bitrate_data, else delta = (delta * alpha_percent - 50) / 100; port_data->ewma_ibits += delta; + /* Integer roundoff prevents EWMA between 0 and (100/alpha_percent) + * ever reaching zero in no-traffic conditions + */ + if (cnt_bits == 0 && delta == 0) + port_data->ewma_ibits = 0; port_data->mean_ibits = cnt_bits; /* Outgoing bitrate (also EWMA) */ @@ -132,6 +137,8 @@ rte_stats_bitrate_calc(struct rte_stats_bitrates *bitrate_data, else delta = (delta * alpha_percent - 50) / 100; port_data->ewma_obits += delta; + if (cnt_bits == 0 && delta == 0) + port_data->ewma_obits = 0; port_data->mean_obits = cnt_bits; values[0] = port_data->ewma_ibits;