From 9f3bb818deadd2a3753a5c822c1dfeb93bf288d9 Mon Sep 17 00:00:00 2001
From: Aastha Mehta <aasthakm@mpi-sws.org>
Date: Mon, 24 Jul 2017 19:18:25 +0200
Subject: [PATCH] bugfix: index overflow, handle case where producer index
 wraps around and becomes smaller than consumer index

---
 .../net/ethernet/broadcom/bnx2x/bnx2x_cmn.c   | 52 ++++++++++++++++---
 1 file changed, 44 insertions(+), 8 deletions(-)

diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
index cc46b914f..6c98f6b20 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
@@ -1179,6 +1179,8 @@ static int bnx2x_rx_int(struct bnx2x_fastpath *fp, int budget)
 	int rx_pkt_int = 0;
 #ifdef CONFIG_XEN_SME
 	char dbg_buff[DBG_BUF_SIZE];
+	u16 tmp_swi_bd_prod, tmp_swi_bd_cons, tmp_swi_comp_prod, tmp_swi_comp_cons;
+	u16 tmp_hwi_bd_prod, tmp_hwi_bd_cons, tmp_hwi_comp_prod, tmp_hwi_comp_cons;
 #endif
 
 #ifdef BNX2X_STOP_ON_ERROR
@@ -1203,10 +1205,23 @@ static int bnx2x_rx_int(struct bnx2x_fastpath *fp, int budget)
 
 #ifdef CONFIG_XEN_SME
 	if (lnk_intercept_rx_path) {
-		while (fp->swi_bd_prod < fp->hwi_bd_prod
-				&& fp->swi_bd_cons < fp->hwi_bd_cons
-				&& fp->swi_comp_prod < fp->hwi_comp_prod
-				&& fp->swi_comp_cons < fp->hwi_comp_cons) {
+		tmp_swi_bd_prod = NEXT_RX_IDX(fp->swi_bd_prod);
+		tmp_swi_bd_cons = NEXT_RX_IDX(fp->swi_bd_cons);
+		tmp_swi_comp_prod = NEXT_RCQ_IDX(fp->swi_comp_prod);
+		tmp_swi_comp_cons = NEXT_RCQ_IDX(fp->swi_comp_cons);
+		tmp_hwi_bd_prod = fp->hwi_bd_prod;
+		tmp_hwi_bd_cons = fp->hwi_bd_cons;
+		tmp_hwi_comp_prod = fp->hwi_comp_prod;
+		tmp_hwi_comp_cons = fp->hwi_comp_cons;
+
+		//while (fp->swi_bd_prod < fp->hwi_bd_prod
+		//		&& fp->swi_bd_cons < fp->hwi_bd_cons
+		//		&& fp->swi_comp_prod < fp->hwi_comp_prod
+		//		&& fp->swi_comp_cons < fp->hwi_comp_cons) {
+		while(RX_BD(tmp_swi_bd_prod) <= RX_BD(tmp_hwi_bd_prod)
+					&& RX_BD(tmp_swi_bd_cons) <= RX_BD(tmp_hwi_bd_cons)
+					&& RCQ_BD(tmp_swi_comp_prod) <= RCQ_BD(tmp_hwi_comp_prod)
+					&& RCQ_BD(tmp_swi_comp_cons) <= RCQ_BD(tmp_hwi_comp_cons)) {
 			memset(dbg_buff, 0, DBG_BUF_SIZE);
 			rx_pkt_int = __bnx2x_rx_int(fp, budget);
 			if (rx_pkt_int == -5) {
@@ -1224,6 +1239,16 @@ static int bnx2x_rx_int(struct bnx2x_fastpath *fp, int budget)
 
 			if (rx_pkt == budget)
 				break;
+
+			tmp_swi_bd_prod = NEXT_RX_IDX(fp->swi_bd_prod);
+			tmp_swi_bd_cons = NEXT_RX_IDX(fp->swi_bd_cons);
+			tmp_swi_comp_prod = NEXT_RCQ_IDX(fp->swi_comp_prod);
+			tmp_swi_comp_cons = NEXT_RCQ_IDX(fp->swi_comp_cons);
+			tmp_hwi_bd_prod = fp->hwi_bd_prod;
+			tmp_hwi_bd_cons = fp->hwi_bd_cons;
+			tmp_hwi_comp_prod = fp->hwi_comp_prod;
+			tmp_hwi_comp_cons = fp->hwi_comp_cons;
+
 		}
 	} else {
 #endif
@@ -3622,6 +3647,8 @@ static int bnx2x_poll(struct napi_struct *napi, int budget)
 	union eth_rx_cqe *cqe = NULL;
 	struct eth_fast_path_rx_cqe *cqe_fp = NULL;
 	int total_work_done = 0;
+	u16 tmp_swi_bd_prod, tmp_swi_bd_cons, tmp_swi_comp_prod, tmp_swi_comp_cons;
+	u16 tmp_hwi_bd_prod, tmp_hwi_bd_cons, tmp_hwi_comp_prod, tmp_hwi_comp_cons;
 #endif
 
 #ifdef BNX2X_STOP_ON_ERROR
@@ -3678,10 +3705,19 @@ redo_poll:
 
 					napi_complete(napi);
 
-					if ((fp->swi_bd_prod < fp->hwi_bd_prod
-							&& fp->swi_bd_cons < fp->hwi_bd_cons
-							&& fp->swi_comp_prod < fp->hwi_comp_prod
-							&& fp->swi_comp_cons < fp->hwi_comp_cons)
+					tmp_swi_bd_prod = NEXT_RX_IDX(fp->swi_bd_prod);
+					tmp_swi_bd_cons = NEXT_RX_IDX(fp->swi_bd_cons);
+					tmp_swi_comp_prod = NEXT_RCQ_IDX(fp->swi_comp_prod);
+					tmp_swi_comp_cons = NEXT_RCQ_IDX(fp->swi_comp_cons);
+					tmp_hwi_bd_prod = fp->hwi_bd_prod;
+					tmp_hwi_bd_cons = fp->hwi_bd_cons;
+					tmp_hwi_comp_prod = fp->hwi_comp_prod;
+					tmp_hwi_comp_cons = fp->hwi_comp_cons;
+
+					if ((RX_BD(tmp_swi_bd_prod) <= RX_BD(tmp_hwi_bd_prod)
+							&& RX_BD(tmp_swi_bd_cons) <= RX_BD(tmp_hwi_bd_cons)
+							&& RCQ_BD(tmp_swi_comp_prod) <= RCQ_BD(tmp_hwi_comp_prod)
+							&& RCQ_BD(tmp_swi_comp_cons) <= RCQ_BD(tmp_hwi_comp_cons))
 							/* || BNX2X_IS_CQE_COMPLETED(cqe_fp) */) { // temporary condition for debugging
 						napi_schedule_irqoff(napi);
 #if 0
-- 
GitLab