From: Remy Horton Date: Wed, 19 Apr 2017 13:26:48 +0000 (+0100) Subject: bitrate: fix integer roundoff X-Git-Tag: spdx-start~3432 X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=0caf72811441b42cb14a28c72007f8ef35b453d6;p=dpdk.git 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 --- 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;