From d421d424110ed557176498207e635028b4458131 Mon Sep 17 00:00:00 2001 From: Lukas Sismis Date: Tue, 18 Apr 2023 13:50:28 +0200 Subject: [PATCH] dpdk: query device stats only with one worker Function rte_eth_stats_get is not thread-safe and the result is only used by one thread. Running with multiple workers led to very high values in rx_missed counters (buffer-overflow-like behavior). Ticket: #6006 --- src/source-dpdk.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/source-dpdk.c b/src/source-dpdk.c index 2c22cc31a8..cf59ad9bba 100644 --- a/src/source-dpdk.c +++ b/src/source-dpdk.c @@ -268,17 +268,17 @@ void TmModuleDecodeDPDKRegister(void) static inline void DPDKDumpCounters(DPDKThreadVars *ptv) { - struct rte_eth_stats eth_stats; - int retval = rte_eth_stats_get(ptv->port_id, ð_stats); - if (unlikely(retval != 0)) { - SCLogError("Failed to get stats for port id %d: %s", ptv->port_id, rte_strerror(-retval)); - return; - } - /* Some NICs (e.g. Intel) do not support queue statistics and the drops can be fetched only on * the port level. Therefore setting it to the first worker to have at least continuous update * on the dropped packets. */ if (ptv->queue_id == 0) { + struct rte_eth_stats eth_stats; + int retval = rte_eth_stats_get(ptv->port_id, ð_stats); + if (unlikely(retval != 0)) { + SCLogError("%s: failed to get stats: %s", ptv->livedev->dev, rte_strerror(-retval)); + return; + } + StatsSetUI64(ptv->tv, ptv->capture_dpdk_packets, ptv->pkts + eth_stats.imissed + eth_stats.ierrors + eth_stats.rx_nombuf); SC_ATOMIC_SET(ptv->livedev->pkts,