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 E9AEEA0093 for ; Tue, 19 May 2020 15:07:37 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id DD3D01D603; Tue, 19 May 2020 15:07:37 +0200 (CEST) Received: from mail-wm1-f65.google.com (mail-wm1-f65.google.com [209.85.128.65]) by dpdk.org (Postfix) with ESMTP id 291021D670 for ; Tue, 19 May 2020 15:07:36 +0200 (CEST) Received: by mail-wm1-f65.google.com with SMTP id z72so3495803wmc.2 for ; Tue, 19 May 2020 06:07:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=RVedHEQw31eeh7pCioN2hDEXOdgKQ7wnnmVcQiWN8S0=; b=m/Xu3v9qGq4gWkJRgxZMktvMbfr5pPPyskb5XU9WAGh5sPH/RhL01rjFFM0Z2gTRTX 09PgX0TQV53FKVvshKJKrymQWaAHSFgFq351Da3lQI+A2eOwqwmk0SrUs2hrdQaVctRG s8v49D4rapKyf08+MMy86z7TTbPUs+BbUI6i2D/7ambDucU/XHVAT1JC0qIgfxl0C1fh PqqjZKASog9s/Uoki32rymVZp1qAPMfUPi/OXKj2eAri4pkGXGxBgGCW6QybLMGKYcnk gsc0aRb9ArWYKhy/jWpN1vk85K/tv2zA7BX80s/L+XctmVAJrljb91OR+WMCg9EBvhrC x0cA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=RVedHEQw31eeh7pCioN2hDEXOdgKQ7wnnmVcQiWN8S0=; b=F6nPr75k8oW2WDltvbHRtW8xkF+xJVOwlJKEdzcTD7RHhhF9Fl9tzHq4LXT+ZC1om3 14hs1iju9zOcWYwW7BWeHVDlBuZKClOAl0OTlrYeVkEbg0t8/Tkb4ob3EtBWuZ2j9e8i rtlYGDmw6TEaur6FXzn+bbip6AewTl53zBxn2eY71WOa91GO+ezC/O6xCSOieerZNUEb fuMgAvcYZhWfPPfB/MmUhUqAoZyO8K/DostA6GMqQ+NHWoOEBgJqgM6sp/dkeM+bjPVC yUE/87RJih8bcp6U2Ze/B/zjO+OnT/Z+oURmvnpJCKoLo+xfuzFjn9Cr+YOU7NsRa3xf XMFw== X-Gm-Message-State: AOAM530538I52h/5/fb8sOzp3rBQws8ntJyoQMaVSzgzO4arLRILmmp6 CNX63mGr+q0efRKPuj/UloezHNrsfTL6METn X-Google-Smtp-Source: ABdhPJy3MflrkWzh6b7oz/mNAjQ8KYTHDfSMARZPqOs+qyC5Bwg4VS5eccq6QaSL0s+oPx5gdmidIw== X-Received: by 2002:a05:600c:d6:: with SMTP id u22mr5115837wmm.45.1589893655838; Tue, 19 May 2020 06:07:35 -0700 (PDT) Received: from localhost ([88.98.246.218]) by smtp.gmail.com with ESMTPSA id s15sm20649482wro.80.2020.05.19.06.07.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 May 2020 06:07:35 -0700 (PDT) From: luca.boccassi@gmail.com To: Jiawei Wang Cc: Viacheslav Ovsiienko , dpdk stable Date: Tue, 19 May 2020 14:02:48 +0100 Message-Id: <20200519130549.112823-33-luca.boccassi@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200519130549.112823-1-luca.boccassi@gmail.com> References: <20200519125804.104349-1-luca.boccassi@gmail.com> <20200519130549.112823-1-luca.boccassi@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-stable] patch 'net/mlx5: fix imissed counter overflow' has been queued to stable release 19.11.3 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" Hi, FYI, your patch has been queued to stable release 19.11.3 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/21/20. 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. Thanks. Luca Boccassi --- >From 7ba59c1fd4dbd5e8758d5c7d532fd4f698f39cdd Mon Sep 17 00:00:00 2001 From: Jiawei Wang Date: Mon, 30 Mar 2020 06:02:10 +0300 Subject: [PATCH] net/mlx5: fix imissed counter overflow [ upstream commit c5193a0bbef8bb7aef23c8ee25d9f89167ac58fb ] The Hw counters is defined as 32bit unsigned value and read from the sysfs. Firstly read the base value while application start, then fetch the new value while do query and minus the base value. If the new value is less than base value, will result in a negative value and convert to the big value as unsigned 64bit. PMD add xstats field to store the last successfully read counter, use it if failed to read hw counter from sysfs. PMD also record the last output value to handle the wrap around case, if overflow happened, increase the wrap count by 1 and save into the higher 32bit, and update the new value into lower 32bit, finally return the 64bit counter value. Fixes: ce9494d76c47 ("net/mlx5: report imissed statistics") Signed-off-by: Jiawei Wang Acked-by: Viacheslav Ovsiienko --- drivers/net/mlx5/mlx5.h | 3 ++ drivers/net/mlx5/mlx5_stats.c | 57 ++++++++++++++++++++++++++++++----- 2 files changed, 52 insertions(+), 8 deletions(-) diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index de80f62cc0..048bc66052 100644 --- a/drivers/net/mlx5/mlx5.h +++ b/drivers/net/mlx5/mlx5.h @@ -148,12 +148,15 @@ struct mlx5_xstats_ctrl { /* Index in the device counters table. */ uint16_t dev_table_idx[MLX5_MAX_XSTATS]; uint64_t base[MLX5_MAX_XSTATS]; + uint64_t xstats[MLX5_MAX_XSTATS]; + uint64_t hw_stats[MLX5_MAX_XSTATS]; struct mlx5_counter_ctrl info[MLX5_MAX_XSTATS]; }; struct mlx5_stats_ctrl { /* Base for imissed counter. */ uint64_t imissed_base; + uint64_t imissed; }; /* devX creation object */ diff --git a/drivers/net/mlx5/mlx5_stats.c b/drivers/net/mlx5/mlx5_stats.c index 205e4fec78..d60a633e15 100644 --- a/drivers/net/mlx5/mlx5_stats.c +++ b/drivers/net/mlx5/mlx5_stats.c @@ -136,7 +136,7 @@ static const struct mlx5_counter_ctrl mlx5_counters_init[] = { static const unsigned int xstats_n = RTE_DIM(mlx5_counters_init); -static inline void +static inline int mlx5_read_ib_stat(struct mlx5_priv *priv, const char *ctr_name, uint64_t *stat) { FILE *file; @@ -152,10 +152,11 @@ mlx5_read_ib_stat(struct mlx5_priv *priv, const char *ctr_name, uint64_t *stat) fclose(file); if (n == 1) - return; + return 0; } } *stat = 0; + return 1; } /** @@ -194,8 +195,14 @@ mlx5_read_dev_counters(struct rte_eth_dev *dev, uint64_t *stats) } for (i = 0; i != xstats_ctrl->mlx5_stats_n; ++i) { if (xstats_ctrl->info[i].ib) { - mlx5_read_ib_stat(priv, xstats_ctrl->info[i].ctr_name, - &stats[i]); + ret = mlx5_read_ib_stat(priv, + xstats_ctrl->info[i].ctr_name, + &stats[i]); + /* return last xstats counter if fail to read. */ + if (ret == 0) + xstats_ctrl->xstats[i] = stats[i]; + else + stats[i] = xstats_ctrl->xstats[i]; } else { stats[i] = (uint64_t) et_stats->data[xstats_ctrl->dev_table_idx[i]]; @@ -301,6 +308,7 @@ mlx5_stats_init(struct rte_eth_dev *dev) unsigned int idx = xstats_ctrl->mlx5_stats_n++; xstats_ctrl->info[idx] = mlx5_counters_init[i]; + xstats_ctrl->hw_stats[idx] = 0; } } assert(xstats_ctrl->mlx5_stats_n <= MLX5_MAX_XSTATS); @@ -311,6 +319,7 @@ mlx5_stats_init(struct rte_eth_dev *dev) DRV_LOG(ERR, "port %u cannot read device counters: %s", dev->data->port_id, strerror(rte_errno)); mlx5_read_ib_stat(priv, "out_of_buffer", &stats_ctrl->imissed_base); + stats_ctrl->imissed = 0; free: rte_free(strings); } @@ -353,7 +362,23 @@ mlx5_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *stats, return ret; for (i = 0; i != mlx5_stats_n; ++i) { stats[i].id = i; - stats[i].value = (counters[i] - xstats_ctrl->base[i]); + if (xstats_ctrl->info[i].ib) { + uint64_t wrap_n; + uint64_t hw_stat = xstats_ctrl->hw_stats[i]; + + stats[i].value = (counters[i] - + xstats_ctrl->base[i]) & + (uint64_t)UINT32_MAX; + wrap_n = hw_stat >> 32; + if (stats[i].value < + (hw_stat & (uint64_t)UINT32_MAX)) + wrap_n++; + stats[i].value |= (wrap_n) << 32; + xstats_ctrl->hw_stats[i] = stats[i].value; + } else { + stats[i].value = + (counters[i] - xstats_ctrl->base[i]); + } } } return mlx5_stats_n; @@ -375,9 +400,12 @@ int mlx5_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) { struct mlx5_priv *priv = dev->data->dev_private; + struct mlx5_stats_ctrl *stats_ctrl = &priv->stats_ctrl; struct rte_eth_stats tmp; unsigned int i; unsigned int idx; + uint64_t wrap_n; + int ret; memset(&tmp, 0, sizeof(tmp)); /* Add software counters. */ @@ -420,8 +448,18 @@ mlx5_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) #endif tmp.oerrors += txq->stats.oerrors; } - mlx5_read_ib_stat(priv, "out_of_buffer", &tmp.imissed); - tmp.imissed -= priv->stats_ctrl.imissed_base; + ret = mlx5_read_ib_stat(priv, "out_of_buffer", &tmp.imissed); + if (ret == 0) { + tmp.imissed = (tmp.imissed - stats_ctrl->imissed_base) & + (uint64_t)UINT32_MAX; + wrap_n = stats_ctrl->imissed >> 32; + if (tmp.imissed < (stats_ctrl->imissed & (uint64_t)UINT32_MAX)) + wrap_n++; + tmp.imissed |= (wrap_n) << 32; + stats_ctrl->imissed = tmp.imissed; + } else { + tmp.imissed = stats_ctrl->imissed; + } #ifndef MLX5_PMD_SOFT_COUNTERS /* FIXME: retrieve and add hardware counters. */ #endif @@ -458,6 +496,7 @@ mlx5_stats_reset(struct rte_eth_dev *dev) sizeof(struct mlx5_txq_stats)); } mlx5_read_ib_stat(priv, "out_of_buffer", &stats_ctrl->imissed_base); + stats_ctrl->imissed = 0; #ifndef MLX5_PMD_SOFT_COUNTERS /* FIXME: reset hardware counters. */ #endif @@ -500,8 +539,10 @@ mlx5_xstats_reset(struct rte_eth_dev *dev) dev->data->port_id, strerror(rte_errno)); return ret; } - for (i = 0; i != n; ++i) + for (i = 0; i != n; ++i) { xstats_ctrl->base[i] = counters[i]; + xstats_ctrl->hw_stats[i] = 0; + } return 0; } -- 2.20.1 --- Diff of the applied patch vs upstream commit (please double-check if non-empty: --- --- - 2020-05-19 14:04:45.940398665 +0100 +++ 0033-net-mlx5-fix-imissed-counter-overflow.patch 2020-05-19 14:04:44.168647502 +0100 @@ -1,8 +1,10 @@ -From c5193a0bbef8bb7aef23c8ee25d9f89167ac58fb Mon Sep 17 00:00:00 2001 +From 7ba59c1fd4dbd5e8758d5c7d532fd4f698f39cdd Mon Sep 17 00:00:00 2001 From: Jiawei Wang Date: Mon, 30 Mar 2020 06:02:10 +0300 Subject: [PATCH] net/mlx5: fix imissed counter overflow +[ upstream commit c5193a0bbef8bb7aef23c8ee25d9f89167ac58fb ] + The Hw counters is defined as 32bit unsigned value and read from the sysfs. Firstly read the base value while application start, then fetch the new value while do query and minus the base value. @@ -17,7 +19,6 @@ return the 64bit counter value. Fixes: ce9494d76c47 ("net/mlx5: report imissed statistics") -Cc: stable@dpdk.org Signed-off-by: Jiawei Wang Acked-by: Viacheslav Ovsiienko @@ -27,10 +28,10 @@ 2 files changed, 52 insertions(+), 8 deletions(-) diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h -index ca6a802211..563d6ab3c0 100644 +index de80f62cc0..048bc66052 100644 --- a/drivers/net/mlx5/mlx5.h +++ b/drivers/net/mlx5/mlx5.h -@@ -112,12 +112,15 @@ struct mlx5_xstats_ctrl { +@@ -148,12 +148,15 @@ struct mlx5_xstats_ctrl { /* Index in the device counters table. */ uint16_t dev_table_idx[MLX5_MAX_XSTATS]; uint64_t base[MLX5_MAX_XSTATS]; @@ -45,12 +46,12 @@ + uint64_t imissed; }; - /* Flow list . */ + /* devX creation object */ diff --git a/drivers/net/mlx5/mlx5_stats.c b/drivers/net/mlx5/mlx5_stats.c -index 7603502967..5bc6fa6aa1 100644 +index 205e4fec78..d60a633e15 100644 --- a/drivers/net/mlx5/mlx5_stats.c +++ b/drivers/net/mlx5/mlx5_stats.c -@@ -139,7 +139,7 @@ static const struct mlx5_counter_ctrl mlx5_counters_init[] = { +@@ -136,7 +136,7 @@ static const struct mlx5_counter_ctrl mlx5_counters_init[] = { static const unsigned int xstats_n = RTE_DIM(mlx5_counters_init); @@ -59,7 +60,7 @@ mlx5_read_ib_stat(struct mlx5_priv *priv, const char *ctr_name, uint64_t *stat) { FILE *file; -@@ -155,10 +155,11 @@ mlx5_read_ib_stat(struct mlx5_priv *priv, const char *ctr_name, uint64_t *stat) +@@ -152,10 +152,11 @@ mlx5_read_ib_stat(struct mlx5_priv *priv, const char *ctr_name, uint64_t *stat) fclose(file); if (n == 1) @@ -72,7 +73,7 @@ } /** -@@ -197,8 +198,14 @@ mlx5_read_dev_counters(struct rte_eth_dev *dev, uint64_t *stats) +@@ -194,8 +195,14 @@ mlx5_read_dev_counters(struct rte_eth_dev *dev, uint64_t *stats) } for (i = 0; i != xstats_ctrl->mlx5_stats_n; ++i) { if (xstats_ctrl->info[i].ib) { @@ -89,15 +90,15 @@ } else { stats[i] = (uint64_t) et_stats->data[xstats_ctrl->dev_table_idx[i]]; -@@ -304,6 +311,7 @@ mlx5_stats_init(struct rte_eth_dev *dev) +@@ -301,6 +308,7 @@ mlx5_stats_init(struct rte_eth_dev *dev) unsigned int idx = xstats_ctrl->mlx5_stats_n++; xstats_ctrl->info[idx] = mlx5_counters_init[i]; + xstats_ctrl->hw_stats[idx] = 0; } } - MLX5_ASSERT(xstats_ctrl->mlx5_stats_n <= MLX5_MAX_XSTATS); -@@ -314,6 +322,7 @@ mlx5_stats_init(struct rte_eth_dev *dev) + assert(xstats_ctrl->mlx5_stats_n <= MLX5_MAX_XSTATS); +@@ -311,6 +319,7 @@ mlx5_stats_init(struct rte_eth_dev *dev) DRV_LOG(ERR, "port %u cannot read device counters: %s", dev->data->port_id, strerror(rte_errno)); mlx5_read_ib_stat(priv, "out_of_buffer", &stats_ctrl->imissed_base); @@ -105,7 +106,7 @@ free: rte_free(strings); } -@@ -356,7 +365,23 @@ mlx5_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *stats, +@@ -353,7 +362,23 @@ mlx5_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *stats, return ret; for (i = 0; i != mlx5_stats_n; ++i) { stats[i].id = i; @@ -130,7 +131,7 @@ } } return mlx5_stats_n; -@@ -378,9 +403,12 @@ int +@@ -375,9 +400,12 @@ int mlx5_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) { struct mlx5_priv *priv = dev->data->dev_private; @@ -143,7 +144,7 @@ memset(&tmp, 0, sizeof(tmp)); /* Add software counters. */ -@@ -423,8 +451,18 @@ mlx5_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) +@@ -420,8 +448,18 @@ mlx5_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) #endif tmp.oerrors += txq->stats.oerrors; } @@ -164,7 +165,7 @@ #ifndef MLX5_PMD_SOFT_COUNTERS /* FIXME: retrieve and add hardware counters. */ #endif -@@ -461,6 +499,7 @@ mlx5_stats_reset(struct rte_eth_dev *dev) +@@ -458,6 +496,7 @@ mlx5_stats_reset(struct rte_eth_dev *dev) sizeof(struct mlx5_txq_stats)); } mlx5_read_ib_stat(priv, "out_of_buffer", &stats_ctrl->imissed_base); @@ -172,7 +173,7 @@ #ifndef MLX5_PMD_SOFT_COUNTERS /* FIXME: reset hardware counters. */ #endif -@@ -503,8 +542,10 @@ mlx5_xstats_reset(struct rte_eth_dev *dev) +@@ -500,8 +539,10 @@ mlx5_xstats_reset(struct rte_eth_dev *dev) dev->data->port_id, strerror(rte_errno)); return ret; }