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 D06B0A09E8 for ; Tue, 8 Dec 2020 13:48:39 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id EED4D72D9; Tue, 8 Dec 2020 13:48:37 +0100 (CET) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by dpdk.org (Postfix) with ESMTP id D955472D9 for ; Tue, 8 Dec 2020 13:48:36 +0100 (CET) Received: from Internal Mail-Server by MTLPINE1 (envelope-from viacheslavo@nvidia.com) with SMTP; 8 Dec 2020 14:48:33 +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 0B8CmXWX018528; Tue, 8 Dec 2020 14:48:33 +0200 From: Viacheslav Ovsiienko To: stable@dpdk.org Cc: ktraynor@redhat.com, shirik@nvidia.com Date: Tue, 8 Dec 2020 12:48:32 +0000 Message-Id: <1607431712-3444-1-git-send-email-viacheslavo@nvidia.com> X-Mailer: git-send-email 1.8.3.1 Subject: [dpdk-stable] [PATCH v2] [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 [ 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 | 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