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 D33E4A09E7 for ; Tue, 8 Dec 2020 08:54:51 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 98DD572DE; Tue, 8 Dec 2020 08:54:49 +0100 (CET) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by dpdk.org (Postfix) with ESMTP id 661B872DE for ; Tue, 8 Dec 2020 08:54:48 +0100 (CET) Received: from Internal Mail-Server by MTLPINE1 (envelope-from shirik@nvidia.com) with SMTP; 8 Dec 2020 09:54:42 +0200 Received: from nvidia.com (c-236-2-60-065.mtl.labs.mlnx [10.236.2.65]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 0B87sg8W014053; Tue, 8 Dec 2020 09:54:42 +0200 From: Shiri Kuzin To: stable@dpdk.org Cc: ktraynor@redhat.com, viacheslavo@nvidia.com, Ralf Hoffmann , Matan Azrad Date: Tue, 8 Dec 2020 09:54:35 +0200 Message-Id: <20201208075435.24659-1-shirik@nvidia.com> X-Mailer: git-send-email 2.21.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 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" [ upstream commit 42dcd453d9b63841a5460a6ca3872eb7648d73bd ] 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") Reported-by: Ralf Hoffmann Signed-off-by: Shiri Kuzin Acked-by: Matan Azrad --- drivers/net/mlx5/mlx5_stats.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/drivers/net/mlx5/mlx5_stats.c b/drivers/net/mlx5/mlx5_stats.c index 6906dc81cc..38a2ffba4a 100644 --- a/drivers/net/mlx5/mlx5_stats.c +++ b/drivers/net/mlx5/mlx5_stats.c @@ -473,8 +473,7 @@ mlx5_xstats_reset(struct rte_eth_dev *dev) 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); @@ -485,14 +484,27 @@ mlx5_xstats_reset(struct rte_eth_dev *dev) } if (xstats_ctrl->stats_n != stats_n) mlx5_stats_init(dev); + counters = malloc(sizeof(*counters) * xstats_ctrl->mlx5_stats_n); + if (!counters) { + DRV_LOG(WARNING, "port %u unable to allocate memory for xstats " + "counters", + dev->data->port_id); + rte_errno = ENOMEM; + return -rte_errno; + } 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)); - return; + free(counters); + return ret; } - for (i = 0; i != n; ++i) + for (i = 0; i != xstats_ctrl->mlx5_stats_n; ++i) { xstats_ctrl->base[i] = counters[i]; + xstats_ctrl->hw_stats[i] = 0; + } + free(counters); + return 0; } /** -- 2.21.0