diff mbox series

[SRU,F/Oracle,3/3] bnxt_en: Fix statistics counters issue during ifdown with older firmware.

Message ID 20200820165748.10264-4-khalid.elmously@canonical.com
State New
Headers show
Series [SRU,F/Oracle,1/3] bnxt_en: Store the running firmware version code. | expand

Commit Message

Khalid Elmously Aug. 20, 2020, 4:57 p.m. UTC
From: Michael Chan <michael.chan@broadcom.com>

BugLink: http://bugs.launchpad.net/bugs/1892397

On older firmware, the hardware statistics are not cleared when the
driver frees the hardware stats contexts during ifdown.  The driver
expects these stats to be cleared and saves a copy before freeing
the stats contexts.  During the next ifup, the driver will likely
allocate the same hardware stats contexts and this will cause a big
increase in the counters as the old counters are added back to the
saved counters.

We fix it by making an additional firmware call to clear the counters
before freeing the hw stats contexts when the firmware is the older
20.x firmware.

Fixes: b8875ca356f1 ("bnxt_en: Save ring statistics before reset.")
Reported-by: Jakub Kicinski <kicinski@fb.com>
Reviewed-by: Vasundhara Volam <vasundhara-v.volam@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Tested-by: Jakub Kicinski <kicinski@fb.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(backported from commit c2dec363feb41544a76c8083aca2378990e17166)
[ kmously: Minor context adjustments ]
Signed-off-by: Khalid Elmously <khalid.elmously@canonical.com>
---
 drivers/net/ethernet/broadcom/bnxt/bnxt.c | 7 +++++++
 1 file changed, 7 insertions(+)

Comments

William Breathitt Gray Aug. 20, 2020, 6:01 p.m. UTC | #1
On Thu, Aug 20, 2020 at 12:57:48PM -0400, Khalid Elmously wrote:
> From: Michael Chan <michael.chan@broadcom.com>
> 
> BugLink: http://bugs.launchpad.net/bugs/1892397
> 
> On older firmware, the hardware statistics are not cleared when the
> driver frees the hardware stats contexts during ifdown.  The driver
> expects these stats to be cleared and saves a copy before freeing
> the stats contexts.  During the next ifup, the driver will likely
> allocate the same hardware stats contexts and this will cause a big
> increase in the counters as the old counters are added back to the
> saved counters.
> 
> We fix it by making an additional firmware call to clear the counters
> before freeing the hw stats contexts when the firmware is the older
> 20.x firmware.
> 
> Fixes: b8875ca356f1 ("bnxt_en: Save ring statistics before reset.")
> Reported-by: Jakub Kicinski <kicinski@fb.com>
> Reviewed-by: Vasundhara Volam <vasundhara-v.volam@broadcom.com>
> Signed-off-by: Michael Chan <michael.chan@broadcom.com>
> Tested-by: Jakub Kicinski <kicinski@fb.com>
> Signed-off-by: David S. Miller <davem@davemloft.net>
> (backported from commit c2dec363feb41544a76c8083aca2378990e17166)
> [ kmously: Minor context adjustments ]
> Signed-off-by: Khalid Elmously <khalid.elmously@canonical.com>
> ---
>  drivers/net/ethernet/broadcom/bnxt/bnxt.c | 7 +++++++
>  1 file changed, 7 insertions(+)
> 
> diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
> index 93d02e8339c4..9af620b05ba8 100644
> --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
> +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
> @@ -6306,6 +6306,7 @@ int bnxt_hwrm_set_coal(struct bnxt *bp)
>  static int bnxt_hwrm_stat_ctx_free(struct bnxt *bp)
>  {
>  	int rc = 0, i;
> +	struct hwrm_stat_ctx_clr_stats_input req0 = {0};
>  	struct hwrm_stat_ctx_free_input req = {0};
>  
>  	if (!bp->bnapi)
> @@ -6314,6 +6315,7 @@ static int bnxt_hwrm_stat_ctx_free(struct bnxt *bp)
>  	if (BNXT_CHIP_TYPE_NITRO_A0(bp))
>  		return 0;
>  
> +	bnxt_hwrm_cmd_hdr_init(bp, &req0, HWRM_STAT_CTX_CLR_STATS, -1, -1);
>  	bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_STAT_CTX_FREE, -1, -1);
>  
>  	mutex_lock(&bp->hwrm_cmd_lock);
> @@ -6323,6 +6325,11 @@ static int bnxt_hwrm_stat_ctx_free(struct bnxt *bp)
>  
>  		if (cpr->hw_stats_ctx_id != INVALID_STATS_CTX_ID) {
>  			req.stat_ctx_id = cpu_to_le32(cpr->hw_stats_ctx_id);
> +			if (BNXT_FW_MAJ(bp) <= 20) {
> +				req0.stat_ctx_id = req.stat_ctx_id;
> +				_hwrm_send_message(bp, &req0, sizeof(req0),
> +						   HWRM_CMD_TIMEOUT);
> +			}
>  

Upstream version gets rid of this newline, but I don't think it'll be
that bad to keep it (might make the code easier to read with overall).

Acked-by: William Breathitt Gray <william.gray@canonical.com>

>  			rc = _hwrm_send_message(bp, &req, sizeof(req),
>  						HWRM_CMD_TIMEOUT);
> -- 
> 2.17.1
> 
> 
> -- 
> kernel-team mailing list
> kernel-team@lists.ubuntu.com
> https://lists.ubuntu.com/mailman/listinfo/kernel-team
diff mbox series

Patch

diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index 93d02e8339c4..9af620b05ba8 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -6306,6 +6306,7 @@  int bnxt_hwrm_set_coal(struct bnxt *bp)
 static int bnxt_hwrm_stat_ctx_free(struct bnxt *bp)
 {
 	int rc = 0, i;
+	struct hwrm_stat_ctx_clr_stats_input req0 = {0};
 	struct hwrm_stat_ctx_free_input req = {0};
 
 	if (!bp->bnapi)
@@ -6314,6 +6315,7 @@  static int bnxt_hwrm_stat_ctx_free(struct bnxt *bp)
 	if (BNXT_CHIP_TYPE_NITRO_A0(bp))
 		return 0;
 
+	bnxt_hwrm_cmd_hdr_init(bp, &req0, HWRM_STAT_CTX_CLR_STATS, -1, -1);
 	bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_STAT_CTX_FREE, -1, -1);
 
 	mutex_lock(&bp->hwrm_cmd_lock);
@@ -6323,6 +6325,11 @@  static int bnxt_hwrm_stat_ctx_free(struct bnxt *bp)
 
 		if (cpr->hw_stats_ctx_id != INVALID_STATS_CTX_ID) {
 			req.stat_ctx_id = cpu_to_le32(cpr->hw_stats_ctx_id);
+			if (BNXT_FW_MAJ(bp) <= 20) {
+				req0.stat_ctx_id = req.stat_ctx_id;
+				_hwrm_send_message(bp, &req0, sizeof(req0),
+						   HWRM_CMD_TIMEOUT);
+			}
 
 			rc = _hwrm_send_message(bp, &req, sizeof(req),
 						HWRM_CMD_TIMEOUT);