patch 'net/mlx5: fix Rx/Tx stats concurrency' has been queued to stable release 21.11.2

Kevin Traynor ktraynor at redhat.com
Tue May 10 14:29:54 CEST 2022


Hi,

FYI, your patch has been queued to stable release 21.11.2

Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet.
It will be pushed if I get no objections before 05/15/22. So please
shout if anyone has objections.

Also note that after the patch there's a diff of the upstream commit vs the
patch applied to the branch. This will indicate if there was any rebasing
needed to apply to the stable branch. If there were code changes for rebasing
(ie: not only metadata diffs), please double check that the rebase was
correctly done.

Queued patches are on a temporary branch at:
https://github.com/kevintraynor/dpdk-stable

This queued commit can be viewed at:
https://github.com/kevintraynor/dpdk-stable/commit/c7e0471948eccde862b20f566e4d153b3ab7fb13

Thanks.

Kevin

---
>From c7e0471948eccde862b20f566e4d153b3ab7fb13 Mon Sep 17 00:00:00 2001
From: Raja Zidane <rzidane at nvidia.com>
Date: Wed, 20 Apr 2022 18:32:17 +0300
Subject: [PATCH] net/mlx5: fix Rx/Tx stats concurrency

[ upstream commit 773a7de21a984bb7bdb6396a659ccc585a44a806 ]

Queue statistics are being continuously updated in Rx/Tx burst
routines while handling traffic. In addition to that, statistics
can be reset (written with zeroes) on statistics reset in other
threads, causing a race condition, which in turn could result in
wrong stats.

The patch provides an approach with reference values, allowing
the actual counters to be writable within Rx/Tx burst threads
only, and updating reference values on stats reset.

Fixes: 87011737b715 ("mlx5: add software counters")

Signed-off-by: Raja Zidane <rzidane at nvidia.com>
Acked-by: Viacheslav Ovsiienko <viacheslavo at nvidia.com>
---
 drivers/net/mlx5/mlx5_rx.h    |  1 +
 drivers/net/mlx5/mlx5_stats.c | 40 +++++++++++++++++++++--------------
 drivers/net/mlx5/mlx5_tx.h    |  1 +
 3 files changed, 26 insertions(+), 16 deletions(-)

diff --git a/drivers/net/mlx5/mlx5_rx.h b/drivers/net/mlx5/mlx5_rx.h
index cb5d51340d..423d80e4a7 100644
--- a/drivers/net/mlx5/mlx5_rx.h
+++ b/drivers/net/mlx5/mlx5_rx.h
@@ -126,4 +126,5 @@ struct mlx5_rxq_data {
 	uint16_t idx; /* Queue index. */
 	struct mlx5_rxq_stats stats;
+	struct mlx5_rxq_stats stats_reset; /* stats on last reset. */
 	rte_xmm_t mbuf_initializer; /* Default rearm/flags for vectorized Rx. */
 	struct rte_mbuf fake_mbuf; /* elts padding for vectorized Rx. */
diff --git a/drivers/net/mlx5/mlx5_stats.c b/drivers/net/mlx5/mlx5_stats.c
index 732775954a..f64fa3587b 100644
--- a/drivers/net/mlx5/mlx5_stats.c
+++ b/drivers/net/mlx5/mlx5_stats.c
@@ -115,16 +115,21 @@ mlx5_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 		if (idx < RTE_ETHDEV_QUEUE_STAT_CNTRS) {
 #ifdef MLX5_PMD_SOFT_COUNTERS
-			tmp.q_ipackets[idx] += rxq->stats.ipackets;
-			tmp.q_ibytes[idx] += rxq->stats.ibytes;
+			tmp.q_ipackets[idx] += rxq->stats.ipackets -
+				rxq->stats_reset.ipackets;
+			tmp.q_ibytes[idx] += rxq->stats.ibytes -
+				rxq->stats_reset.ibytes;
 #endif
 			tmp.q_errors[idx] += (rxq->stats.idropped +
-					      rxq->stats.rx_nombuf);
+					      rxq->stats.rx_nombuf) -
+					      (rxq->stats_reset.idropped +
+					      rxq->stats_reset.rx_nombuf);
 		}
 #ifdef MLX5_PMD_SOFT_COUNTERS
-		tmp.ipackets += rxq->stats.ipackets;
-		tmp.ibytes += rxq->stats.ibytes;
+		tmp.ipackets += rxq->stats.ipackets - rxq->stats_reset.ipackets;
+		tmp.ibytes += rxq->stats.ibytes - rxq->stats_reset.ibytes;
 #endif
-		tmp.ierrors += rxq->stats.idropped;
-		tmp.rx_nombuf += rxq->stats.rx_nombuf;
+		tmp.ierrors += rxq->stats.idropped - rxq->stats_reset.idropped;
+		tmp.rx_nombuf += rxq->stats.rx_nombuf -
+					rxq->stats_reset.rx_nombuf;
 	}
 	for (i = 0; (i != priv->txqs_n); ++i) {
@@ -136,13 +141,15 @@ mlx5_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 		if (idx < RTE_ETHDEV_QUEUE_STAT_CNTRS) {
 #ifdef MLX5_PMD_SOFT_COUNTERS
-			tmp.q_opackets[idx] += txq->stats.opackets;
-			tmp.q_obytes[idx] += txq->stats.obytes;
+			tmp.q_opackets[idx] += txq->stats.opackets -
+						txq->stats_reset.opackets;
+			tmp.q_obytes[idx] += txq->stats.obytes -
+						txq->stats_reset.obytes;
 #endif
 		}
 #ifdef MLX5_PMD_SOFT_COUNTERS
-		tmp.opackets += txq->stats.opackets;
-		tmp.obytes += txq->stats.obytes;
+		tmp.opackets += txq->stats.opackets - txq->stats_reset.opackets;
+		tmp.obytes += txq->stats.obytes - txq->stats_reset.obytes;
 #endif
-		tmp.oerrors += txq->stats.oerrors;
+		tmp.oerrors += txq->stats.oerrors - txq->stats_reset.oerrors;
 	}
 	ret = mlx5_os_read_dev_stat(priv, "out_of_buffer", &tmp.imissed);
@@ -186,11 +193,12 @@ mlx5_stats_reset(struct rte_eth_dev *dev)
 		if (rxq_data == NULL)
 			continue;
-		memset(&rxq_data->stats, 0, sizeof(struct mlx5_rxq_stats));
+		rxq_data->stats_reset = rxq_data->stats;
 	}
 	for (i = 0; (i != priv->txqs_n); ++i) {
-		if ((*priv->txqs)[i] == NULL)
+		struct mlx5_txq_data *txq_data = (*priv->txqs)[i];
+
+		if (txq_data == NULL)
 			continue;
-		memset(&(*priv->txqs)[i]->stats, 0,
-		       sizeof(struct mlx5_txq_stats));
+		txq_data->stats_reset = txq_data->stats;
 	}
 	mlx5_os_read_dev_stat(priv, "out_of_buffer", &stats_ctrl->imissed_base);
diff --git a/drivers/net/mlx5/mlx5_tx.h b/drivers/net/mlx5/mlx5_tx.h
index 6be3684bb3..6ed00f722e 100644
--- a/drivers/net/mlx5/mlx5_tx.h
+++ b/drivers/net/mlx5/mlx5_tx.h
@@ -162,4 +162,5 @@ struct mlx5_txq_data {
 	struct mlx5_dev_ctx_shared *sh; /* Shared context. */
 	struct mlx5_txq_stats stats; /* TX queue counters. */
+	struct mlx5_txq_stats stats_reset; /* stats on last reset. */
 	struct mlx5_uar_data uar_data;
 	struct rte_mbuf *elts[0];
-- 
2.34.1

---
  Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- -	2022-05-10 13:24:22.082870081 +0100
+++ 0017-net-mlx5-fix-Rx-Tx-stats-concurrency.patch	2022-05-10 13:24:21.607646365 +0100
@@ -1 +1 @@
-From 773a7de21a984bb7bdb6396a659ccc585a44a806 Mon Sep 17 00:00:00 2001
+From c7e0471948eccde862b20f566e4d153b3ab7fb13 Mon Sep 17 00:00:00 2001
@@ -5,0 +6,2 @@
+[ upstream commit 773a7de21a984bb7bdb6396a659ccc585a44a806 ]
+
@@ -17 +18,0 @@
-Cc: stable at dpdk.org
@@ -28 +29 @@
-index 5bf88b6181..e715ed6b62 100644
+index cb5d51340d..423d80e4a7 100644
@@ -31 +32 @@
-@@ -127,4 +127,5 @@ struct mlx5_rxq_data {
+@@ -126,4 +126,5 @@ struct mlx5_rxq_data {
@@ -109 +110 @@
-index dfa04612ff..20776919c2 100644
+index 6be3684bb3..6ed00f722e 100644
@@ -112 +113 @@
-@@ -165,4 +165,5 @@ struct mlx5_txq_data {
+@@ -162,4 +162,5 @@ struct mlx5_txq_data {



More information about the stable mailing list