diff options
author | Ole Troan <otroan@employees.org> | 2024-06-13 11:40:25 +0200 |
---|---|---|
committer | Florin Coras <florin.coras@gmail.com> | 2024-06-18 17:13:16 +0000 |
commit | dd6fb60f1794fc08ec40598a67dc70f942c200d1 (patch) | |
tree | 60104c5aad87ca9f16136454ac25e5310c7e15a3 /src/plugins/dpdk/device/dpdk_priv.h | |
parent | 32dc913e6f3a026fc8e1fec396b12e70dfeb4cf0 (diff) |
dpdk: expose xstats in stats segment
Expose DPDK xstats in the stat segment.
Represented as a 2D array. Thread by sw_if_index.
Each counter has the same name as the corresponding xstats counter,
under /if/<driver-name>/<xstats-name>
Type: improvement
Change-Id: Icd34b46e2b4d708f1c9a7063d6afd4ced3dfa4f5
Signed-off-by: Ole Troan <otroan@employees.org>
Diffstat (limited to 'src/plugins/dpdk/device/dpdk_priv.h')
-rw-r--r-- | src/plugins/dpdk/device/dpdk_priv.h | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/src/plugins/dpdk/device/dpdk_priv.h b/src/plugins/dpdk/device/dpdk_priv.h index cb7b185c112..0af435767d2 100644 --- a/src/plugins/dpdk/device/dpdk_priv.h +++ b/src/plugins/dpdk/device/dpdk_priv.h @@ -47,28 +47,35 @@ dpdk_device_flag_set (dpdk_device_t *xd, __typeof__ (xd->flags) flag, int val) xd->flags = val ? xd->flags | flag : xd->flags & ~flag; } +void dpdk_counters_xstats_init (dpdk_device_t *xd); + static inline void -dpdk_get_xstats (dpdk_device_t * xd) +dpdk_get_xstats (dpdk_device_t *xd, u32 thread_index) { - int len, ret; - + int ret; + int i; + int len = vec_len (xd->xstats); if (!(xd->flags & DPDK_DEVICE_FLAG_ADMIN_UP)) return; - - len = rte_eth_xstats_get (xd->port_id, NULL, 0); - if (len < 0) + if (xd->driver == 0) return; - vec_validate (xd->xstats, len - 1); - ret = rte_eth_xstats_get (xd->port_id, xd->xstats, len); - if (ret < 0 || ret > len) + if (ret < 0 || ret > len || len != vec_len (xd->driver->xstats_counters)) { + /* Failed, expand vector and try again on next time around the track. */ + vec_validate (xd->xstats, ret - 1); vec_set_len (xd->xstats, 0); + dpdk_log_warn ("rte_eth_xstats_get(%d) failed: %d", xd->port_id, ret); return; } + vec_foreach_index (i, xd->xstats) + { + vlib_set_simple_counter (&xd->driver->xstats_counters[i], thread_index, + xd->sw_if_index, xd->xstats[i].value); + } - vec_set_len (xd->xstats, len); + vec_set_len (xd->xstats, ret); } #define DPDK_UPDATE_COUNTER(vnm, tidx, xd, stat, cnt) \ @@ -107,7 +114,7 @@ dpdk_update_counters (dpdk_device_t * xd, f64 now) DPDK_UPDATE_COUNTER (vnm, thread_index, xd, ierrors, VNET_INTERFACE_COUNTER_RX_ERROR); - dpdk_get_xstats (xd); + dpdk_get_xstats (xd, thread_index); } #if RTE_VERSION < RTE_VERSION_NUM(21, 11, 0, 0) |