diff options
author | Christian Hopps <chopps@gmail.com> | 2020-08-23 13:37:34 +0000 |
---|---|---|
committer | Damjan Marion <dmarion@me.com> | 2020-09-08 16:55:52 +0000 |
commit | 527746ff062d2daf687bdff08d200282c69e5e19 (patch) | |
tree | 2a693696006d166672ee0d28cac3b25ca65b3c13 /src/plugins/dpdk | |
parent | 97d39e3e054ee681335197205e94fbf9a97a40e4 (diff) |
dpdk: fix interface counters to never go backward
Was seeing imissed counter become negative. Reuse the RX_ERROR code for all
three error counters to avoid the problem.
Type: fix
Change-Id: I99a69c8816326682745785ecd30e18a131ac2969
Signed-off-by: Christian Hopps <chopps@labn.net>
Diffstat (limited to 'src/plugins/dpdk')
-rw-r--r-- | src/plugins/dpdk/device/dpdk_priv.h | 57 |
1 files changed, 24 insertions, 33 deletions
diff --git a/src/plugins/dpdk/device/dpdk_priv.h b/src/plugins/dpdk/device/dpdk_priv.h index 64cd10dc23d..46b87512bb8 100644 --- a/src/plugins/dpdk/device/dpdk_priv.h +++ b/src/plugins/dpdk/device/dpdk_priv.h @@ -73,13 +73,29 @@ dpdk_get_xstats (dpdk_device_t * xd) _vec_len (xd->xstats) = len; } +#define DPDK_UPDATE_COUNTER(vnm, tidx, xd, stat, cnt) \ + do \ + { \ + u64 _v = (xd)->stats.stat; \ + u64 _lv = (xd)->last_stats.stat; \ + if (PREDICT_FALSE (_v != _lv)) \ + { \ + if (PREDICT_FALSE (_v < _lv)) \ + dpdk_log_warn ("%v: %s counter decreased (before %lu after %lu)", \ + xd->name, #stat, _lv, _v); \ + else \ + vlib_increment_simple_counter ( \ + vec_elt_at_index ((vnm)->interface_main.sw_if_counters, cnt), \ + (tidx), (xd)->sw_if_index, _v - _lv); \ + } \ + } \ + while (0) + static inline void dpdk_update_counters (dpdk_device_t * xd, f64 now) { - vlib_simple_counter_main_t *cm; vnet_main_t *vnm = vnet_get_main (); u32 thread_index = vlib_get_thread_index (); - u64 rxerrors, last_rxerrors; /* only update counters for PMD interfaces */ if ((xd->flags & DPDK_DEVICE_FLAG_PMD) == 0) @@ -90,37 +106,12 @@ dpdk_update_counters (dpdk_device_t * xd, f64 now) rte_eth_stats_get (xd->port_id, &xd->stats); /* maybe bump interface rx no buffer counter */ - if (PREDICT_FALSE (xd->stats.rx_nombuf != xd->last_stats.rx_nombuf)) - { - cm = vec_elt_at_index (vnm->interface_main.sw_if_counters, - VNET_INTERFACE_COUNTER_RX_NO_BUF); - - vlib_increment_simple_counter (cm, thread_index, xd->sw_if_index, - xd->stats.rx_nombuf - - xd->last_stats.rx_nombuf); - } - - /* missed pkt counter */ - if (PREDICT_FALSE (xd->stats.imissed != xd->last_stats.imissed)) - { - cm = vec_elt_at_index (vnm->interface_main.sw_if_counters, - VNET_INTERFACE_COUNTER_RX_MISS); - - vlib_increment_simple_counter (cm, thread_index, xd->sw_if_index, - xd->stats.imissed - - xd->last_stats.imissed); - } - rxerrors = xd->stats.ierrors; - last_rxerrors = xd->last_stats.ierrors; - - if (PREDICT_FALSE (rxerrors != last_rxerrors)) - { - cm = vec_elt_at_index (vnm->interface_main.sw_if_counters, - VNET_INTERFACE_COUNTER_RX_ERROR); - - vlib_increment_simple_counter (cm, thread_index, xd->sw_if_index, - rxerrors - last_rxerrors); - } + DPDK_UPDATE_COUNTER (vnm, thread_index, xd, rx_nombuf, + VNET_INTERFACE_COUNTER_RX_NO_BUF); + DPDK_UPDATE_COUNTER (vnm, thread_index, xd, imissed, + VNET_INTERFACE_COUNTER_RX_MISS); + DPDK_UPDATE_COUNTER (vnm, thread_index, xd, ierrors, + VNET_INTERFACE_COUNTER_RX_ERROR); dpdk_get_xstats (xd); } |