From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 58194A09E8 for ; Tue, 8 Dec 2020 13:28:18 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 1B7BAA3; Tue, 8 Dec 2020 13:28:17 +0100 (CET) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by dpdk.org (Postfix) with ESMTP id 3CECBA3 for ; Tue, 8 Dec 2020 13:28:14 +0100 (CET) Received: from Internal Mail-Server by MTLPINE1 (envelope-from viacheslavo@nvidia.com) with SMTP; 8 Dec 2020 14:28:11 +0200 Received: from nvidia.com (pegasus12.mtr.labs.mlnx [10.210.17.40]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 0B8CSBmV020524; Tue, 8 Dec 2020 14:28:11 +0200 From: Viacheslav Ovsiienko To: stable@dpdk.org Cc: ktraynor@redhat.com, shirik@nvidia.com Date: Tue, 8 Dec 2020 12:28:09 +0000 Message-Id: <1607430489-12148-1-git-send-email-viacheslavo@nvidia.com> X-Mailer: git-send-email 1.8.3.1 Subject: [dpdk-stable] [PATCH] [18.11] net/mlx5: fix xstats reset reinitialization X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-bounces@dpdk.org Sender: "stable" From: Shiri Kuzin From: Shiri Kuzin 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@dpdk.org Reported-by: Ralf Hoffmann Signed-off-by: Shiri Kuzin Acked-by: Matan Azrad --- 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