aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/dpdk/device/dpdk_priv.h
diff options
context:
space:
mode:
authorOle Troan <otroan@employees.org>2024-06-13 11:40:25 +0200
committerFlorin Coras <florin.coras@gmail.com>2024-06-18 17:13:16 +0000
commitdd6fb60f1794fc08ec40598a67dc70f942c200d1 (patch)
tree60104c5aad87ca9f16136454ac25e5310c7e15a3 /src/plugins/dpdk/device/dpdk_priv.h
parent32dc913e6f3a026fc8e1fec396b12e70dfeb4cf0 (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.h29
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)