From: Lukas Sismis Date: Tue, 18 Apr 2023 11:50:28 +0000 (+0200) Subject: dpdk: query device stats only with one worker X-Git-Tag: suricata-7.0.0-rc2~169 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d421d424110ed557176498207e635028b4458131;p=thirdparty%2Fsuricata.git 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 --- 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,