[dpdk-stable] [PATCH] [18.11] net/mlx5: fix xstats reset reinitialization

Viacheslav Ovsiienko viacheslavo at nvidia.com
Tue Dec 8 13:28:09 CET 2020


From: Shiri Kuzin <shirik at nvidia.com>

From: Shiri Kuzin <shirik at nvidia.com>

The mlx5_xstats_reset clears the device extended statistics.
In this function the driver may reinitialize the structures
that are used to read device counters.

In case of reinitialization, the number of counters may
change, which wouldn't be taken into account by the
reset API callback and can cause a segmentation fault.

This issue is fixed by allocating the counters size after
the reinitialization.

Fixes: a4193ae3bc4f ("net/mlx5: support extended statistics")
Cc: stable at dpdk.org

Reported-by: Ralf Hoffmann <ralf.hoffmann at allegro-packets.com>
Signed-off-by: Shiri Kuzin <shirik at nvidia.com>
Acked-by: Matan Azrad <matan at nvidia.com>
---
 drivers/net/mlx5/mlx5_stats.c | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)

diff --git a/drivers/net/mlx5/mlx5_stats.c b/drivers/net/mlx5/mlx5_stats.c
index 0b1fe3d..5e3a0d2 100644
--- a/drivers/net/mlx5/mlx5_stats.c
+++ b/drivers/net/mlx5/mlx5_stats.c
@@ -480,8 +480,7 @@
 	struct mlx5_xstats_ctrl *xstats_ctrl = &priv->xstats_ctrl;
 	int stats_n;
 	unsigned int i;
-	unsigned int n = xstats_ctrl->mlx5_stats_n;
-	uint64_t counters[n];
+	uint64_t *counters;
 	int ret;
 
 	stats_n = mlx5_ethtool_get_stats_n(dev);
@@ -492,14 +491,26 @@
 	}
 	if (xstats_ctrl->stats_n != stats_n)
 		mlx5_stats_init(dev);
+	counters =  rte_malloc("xstats_counters",
+			       sizeof(*counters) * xstats_ctrl->mlx5_stats_n,
+			       SOCKET_ID_ANY);
+	if (!counters) {
+		DRV_LOG(WARNING, "port %u unable to allocate memory "
+				 "for xstats counters",
+				 dev->data->port_id);
+		rte_errno = ENOMEM;
+		return;
+	}
 	ret = mlx5_read_dev_counters(dev, counters);
 	if (ret) {
 		DRV_LOG(ERR, "port %u cannot read device counters: %s",
 			dev->data->port_id, strerror(rte_errno));
+		rte_free(counters);
 		return;
 	}
-	for (i = 0; i != n; ++i)
+	for (i = 0; i != xstats_ctrl->mlx5_stats_n; ++i)
 		xstats_ctrl->base[i] = counters[i];
+	rte_free(counters);
 }
 
 /**
-- 
1.8.3.1



More information about the stable mailing list