From 8dfde0235e907120fb79c64f1a2110c1b3fb05ee Mon Sep 17 00:00:00 2001
From: Aastha Mehta <aasthakm@mpi-sws.org>
Date: Mon, 26 Jun 2017 16:21:54 +0200
Subject: [PATCH] change NAPI budget; timestamp in hwirq; modify poll function
 to enable interrupt after every rcv pkt processing

---
 .../net/ethernet/broadcom/bnx2x/bnx2x_cmn.c   | 234 ++++++++----------
 .../net/ethernet/broadcom/bnx2x/bnx2x_cmn.h   |  17 --
 2 files changed, 108 insertions(+), 143 deletions(-)

diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
index 79caa7ee3..0f2eebf42 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
@@ -35,6 +35,11 @@
 
 #ifdef CONFIG_XEN_SME
 #include <linux/irqdesc.h>
+extern int (*lnk_intercept_sk_buff) (struct sk_buff *skb, char *extra_dbg_string);
+extern int (*lnk_intercept_rx_path) (void *dev, int fp_idx,
+		uint16_t rx_bd_prod, uint16_t rx_bd_cons,
+		uint16_t comp_prod, uint16_t comp_cons, char *extra_dbg_string);
+#define SME_NAPI_POLL_WEIGHT 1
 #endif
 
 static void bnx2x_free_fp_mem_cnic(struct bnx2x *bp);
@@ -59,8 +64,13 @@ static void bnx2x_add_all_napi(struct bnx2x *bp)
 
 	/* Add NAPI objects */
 	for_each_eth_queue(bp, i) {
+#if CONFIG_XEN_SME
+		netif_napi_add(bp->dev, &bnx2x_fp(bp, i, napi),
+				bnx2x_poll, SME_NAPI_POLL_WEIGHT);
+#else
 		netif_napi_add(bp->dev, &bnx2x_fp(bp, i, napi),
 			       bnx2x_poll, NAPI_POLL_WEIGHT);
+#endif
 	}
 }
 
@@ -208,28 +218,11 @@ static u16 bnx2x_free_tx_pkt(struct bnx2x *bp, struct bnx2x_fp_txdata *txdata,
 	int nbd;
 	u16 split_bd_len = 0;
 
-#if 0
-#ifdef CONFIG_XEN_SME
-	char dbg_buff[DBG_BUF_SIZE];
-	memset(dbg_buff, 0, DBG_BUF_SIZE);
-#endif
-#endif
 	/* prefetch skb end pointer to speedup dev_kfree_skb() */
 	prefetch(&skb->end);
 
-#ifdef CONFIG_XEN_SME
-#if 0
-	if (bp->msg_enable & NETIF_MSG_TX_DONE) {
-		sprintf(dbg_buff, "[%s:%d(%s)] fp[%d]: pkt_idx %d  buff @(%p)->skb %p\n",
-				__func__, __LINE__, (bp->dev ? bp->dev->name : "?"),
-	   txdata->txq_index, idx, tx_buf, skb);
-		xsl_print_sk_buff(NULL, dbg_buff);
-	}
-#endif
-#else
 	DP(NETIF_MSG_TX_DONE, "fp[%d]: pkt_idx %d  buff @(%p)->skb %p\n",
 	   txdata->txq_index, idx, tx_buf, skb);
-#endif
 
 	tx_start_bd = &txdata->tx_desc_ring[bd_idx].start_bd;
 
@@ -298,11 +291,6 @@ int bnx2x_tx_int(struct bnx2x *bp, struct bnx2x_fp_txdata *txdata)
 	u16 hw_cons, sw_cons, bd_cons = txdata->tx_bd_cons;
 	unsigned int pkts_compl = 0, bytes_compl = 0;
 
-#if 0
-#ifdef CONFIG_XEN_SME
-	char dbg_buff[DBG_BUF_SIZE];
-#endif
-#endif
 #ifdef BNX2X_STOP_ON_ERROR
 	if (unlikely(bp->panic))
 		return -1;
@@ -317,22 +305,9 @@ int bnx2x_tx_int(struct bnx2x *bp, struct bnx2x_fp_txdata *txdata)
 
 		pkt_cons = TX_BD(sw_cons);
 
-#ifdef CONFIG_XEN_SME
-#if 0
-		memset(dbg_buff, 0, DBG_BUF_SIZE);
-		if (bp->msg_enable & NETIF_MSG_TX_DONE) {
-			sprintf(dbg_buff,
-				 "[%s:%d(%s)] queue[%d]: hw_cons %u  sw_cons %u  pkt_cons %u\n",
-				 __func__, __LINE__, (bp->dev ? bp->dev->name : "?"),
-				 txdata->txq_index, hw_cons, sw_cons, pkt_cons);
-			xsl_print_sk_buff(NULL, dbg_buff);
-		}
-#endif
-#else
 		DP(NETIF_MSG_TX_DONE,
 		   "queue[%d]: hw_cons %u  sw_cons %u  pkt_cons %u\n",
 		   txdata->txq_index, hw_cons, sw_cons, pkt_cons);
-#endif
 
 		bd_cons = bnx2x_free_tx_pkt(bp, txdata, pkt_cons,
 					    &pkts_compl, &bytes_compl);
@@ -957,21 +932,8 @@ static int bnx2x_rx_int(struct bnx2x_fastpath *fp, int budget)
 	cqe = &fp->rx_comp_ring[comp_ring_cons];
 	cqe_fp = &cqe->fast_path_cqe;
 
-#ifdef CONFIG_XEN_SME
-#if 0
-	if (bp->msg_enable & NETIF_MSG_RX_STATUS) {
-		memset(dbg_buff, 0, DBG_BUF_SIZE);
-		sprintf(dbg_buff,
-	   "[%s:%d(%s)] queue[%d]: sw_comp_cons %u\n"
-		 , __func__, __LINE__, (bp->dev ? bp->dev->name : "?")
-		 , fp->index, sw_comp_cons);
-		xsl_print_sk_buff(NULL, dbg_buff);
-	}
-#endif
-#else
 	DP(NETIF_MSG_RX_STATUS,
 	   "queue[%d]: sw_comp_cons %u\n", fp->index, sw_comp_cons);
-#endif
 
 	while (BNX2X_IS_CQE_COMPLETED(cqe_fp)) {
 		struct sw_rx_bd *rx_buf = NULL;
@@ -1139,16 +1101,6 @@ static int bnx2x_rx_int(struct bnx2x_fastpath *fp, int budget)
 						 fp->rx_buf_size,
 						 DMA_FROM_DEVICE);
 				skb = build_skb(data, fp->rx_frag_size);
-#ifdef CONFIG_XEN_SME
-				memset(dbg_buff, 0, DBG_BUF_SIZE);
-				sprintf(dbg_buff, "%s:%d frag size: %d, fp index %d pad %d len %d\n"
-						", bd_prod_fw %u bd_prod %u bd_cons %u sw_comp_prod %u sw_comp_cons %u"
-						, __func__, __LINE__
-						, (fp ? fp->rx_frag_size : -1), fp->index, pad, len
-						, bd_prod_fw, bd_prod, bd_cons, sw_comp_prod, sw_comp_cons
-						);
-				xsl_print_sk_buff(skb, dbg_buff);
-#endif
 				if (unlikely(!skb)) {
 					bnx2x_frag_free(fp, data);
 					bnx2x_fp_qstats(bp, fp)->
@@ -1191,15 +1143,20 @@ reuse_rx:
 			__vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q),
 					       le16_to_cpu(cqe_fp->vlan_tag));
 
-#if 0
 #ifdef CONFIG_XEN_SME
-		memset(dbg_buff, 0, DBG_BUF_SIZE);
-		sprintf(dbg_buff, "%s:%d caller: %pS, frag size: %d, fp index %d\n"
-				", bd_prod_fw %u bd_prod %u bd_cons %u sw_comp_prod %u sw_comp_cons %u"
-				, __func__, __LINE__, __builtin_return_address(0)
-				, (fp ? fp->rx_frag_size : -1), fp->index
-				, bd_prod_fw, bd_prod, bd_cons, sw_comp_prod, sw_comp_cons
-				);
+#if 0
+		DP(NETIF_MSG_INTR, "SWIRQ: [fp %d fw_sd %d igusb %d]"
+				", bd_prod: %u (%u) bd_cons: %u (%u) sw_comp_prod: %u (%u) sw_comp_cons: %u (%u)"
+				, fp->index, fp->fw_sb_id, fp->igu_sb_id
+				, fp->rx_bd_prod, bd_prod, fp->rx_bd_cons, bd_cons
+				, fp->rx_comp_prod, sw_comp_prod, fp->rx_comp_cons, sw_comp_cons);
+		if (lnk_intercept_sk_buff) {
+			//bnx2x_set_rx_ts(bp, skb);
+			memset(dbg_buff, 0, DBG_BUF_SIZE);
+			sprintf(dbg_buff, "%s:%d called set Rx TS"
+					, __func__, __LINE__);
+			xsl_print_sk_buff(skb, dbg_buff);
+		}
 #endif
 #endif
 		napi_gro_receive(&fp->napi, skb);
@@ -1223,20 +1180,6 @@ next_cqe:
 		comp_ring_cons = RCQ_BD(sw_comp_cons);
 		cqe = &fp->rx_comp_ring[comp_ring_cons];
 		cqe_fp = &cqe->fast_path_cqe;
-#if 0
-#ifdef CONFIG_XEN_SME
-		memset(dbg_buff, 0, DBG_BUF_SIZE);
-		sprintf(dbg_buff, "%s:%d caller: %pS, frag size: %d, fp index: %d\n"
-				", bd_prod_fw %u bd_prod %u bd_cons %u sw_comp_prod %u sw_comp_cons %u\n"
-				", rx buf %p, rx buf data: %p"
-				, __func__, __LINE__, __builtin_return_address(0)
-				, (fp ? fp->rx_frag_size : -1), fp->index
-				, bd_prod_fw, bd_prod, bd_cons, sw_comp_prod, sw_comp_cons
-				, rx_buf, (rx_buf ? rx_buf->data : NULL)
-				);
-		xsl_print_sk_buff(skb, dbg_buff);
-#endif
-#endif
 	} /* while */
 
 	fp->rx_bd_cons = bd_cons;
@@ -1244,6 +1187,17 @@ next_cqe:
 	fp->rx_comp_cons = sw_comp_cons;
 	fp->rx_comp_prod = sw_comp_prod;
 
+#ifdef CONFIG_XEN_SME
+#if 0
+		DP(NETIF_MSG_INTR, "SWIRQ: [fp %d fw_sd %d igusb %d]"
+		", bd_prod: %u (%u) bd_cons: %u (%u) sw_comp_prod: %u (%u) sw_comp_cons: %u (%u)"
+		", rx_pkt: %d, budget: %d, cqe_fp: %p"
+		, fp->index, fp->fw_sb_id, fp->igu_sb_id
+		, fp->rx_bd_prod, bd_prod, fp->rx_bd_cons, bd_cons
+		, fp->rx_comp_prod, sw_comp_prod, fp->rx_comp_cons, sw_comp_cons
+		, rx_pkt, budget, cqe_fp);
+#endif
+#endif
 	/* Update producers */
 	bnx2x_update_rx_prod(bp, fp, bd_prod_fw, sw_comp_prod,
 			     fp->rx_sge_prod);
@@ -1263,23 +1217,21 @@ static irqreturn_t bnx2x_msix_fp_int(int irq, void *fp_cookie)
 	struct msi_desc *d_msid = NULL;
 	struct napi_struct *fp_napi = &bnx2x_fp(bp, fp->index, napi);
 	int napi_weight = fp_napi->weight;
-	//if (bp->msg_enable & NETIF_MSG_INTR) {
-		d_irqd = irq_to_desc(irq);
-		d_msid = irq_get_msi_desc(irq);
-		memset(dbg_buff, 0, DBG_BUF_SIZE);
-		sprintf(dbg_buff,
-	   "[%s:%d(%s)] got an MSI-X interrupt on IDX:SB [fp %d fw_sd %d igusb %d]\n"
-		 "IRQ: %d, id: %p md: %p bd_prod: %u bd_cons: %u "
-		 "sw_comp_prod: %u sw_comp_cons: %u, NAPI wt: %d\n"
-		 , __func__, __LINE__, (bp->dev ? bp->dev->name : "?")
-	   , fp->index, fp->fw_sb_id, fp->igu_sb_id
-		 , irq, d_irqd, d_msid, fp->rx_bd_prod, fp->rx_bd_cons
-		 , fp->rx_comp_prod, fp->rx_comp_cons, napi_weight
-		 );
-		//xsl_print_sk_buff(NULL, dbg_buff);
-	//}
-		xsl_intercept_rx_path((void *) bp->dev, fp->index, fp->rx_bd_prod,
-				fp->rx_bd_cons, fp->rx_comp_prod, fp->rx_comp_cons, dbg_buff);
+	d_irqd = irq_to_desc(irq);
+	d_msid = irq_get_msi_desc(irq);
+	memset(dbg_buff, 0, DBG_BUF_SIZE);
+	sprintf(dbg_buff,
+	 "[%s:%d(%s)] got an MSI-X interrupt on IDX:SB [fp %d fw_sd %d igusb %d]\n"
+	 "IRQ: %d, id: %p md: %p bd_prod: %u bd_cons: %u "
+	 "sw_comp_prod: %u sw_comp_cons: %u, NAPI wt: %d, NAPI.poll_list empty: %d\n"
+	 , __func__, __LINE__, (bp->dev ? bp->dev->name : "?")
+	 , fp->index, fp->fw_sb_id, fp->igu_sb_id
+	 , irq, d_irqd, d_msid, fp->rx_bd_prod, fp->rx_bd_cons
+	 , fp->rx_comp_prod, fp->rx_comp_cons, napi_weight
+	 , list_empty(&fp_napi->poll_list) ? 1 : 0
+	 );
+	xsl_intercept_rx_path((void *) bp->dev, fp->index, RX_BD(fp->rx_bd_prod),
+				RX_BD(fp->rx_bd_cons), fp->rx_comp_prod, fp->rx_comp_cons, dbg_buff);
 #else
 	DP(NETIF_MSG_INTR,
 	   "got an MSI-X interrupt on IDX:SB [fp %d fw_sd %d igusb %d]\n",
@@ -2064,14 +2016,6 @@ u16 bnx2x_select_queue(struct net_device *dev, struct sk_buff *skb,
 {
 	struct bnx2x *bp = netdev_priv(dev);
 
-#if 0
-#ifdef CONFIG_XEN_SME
-	char dbg_buff[DBG_BUF_SIZE];
-	memset(dbg_buff, 0, DBG_BUF_SIZE);
-	sprintf(dbg_buff, "%s:%d caller: %pS", __func__, __LINE__, __builtin_return_address(0));
-	xsl_print_sk_buff(skb, dbg_buff);
-#endif
-#endif
 	if (CNIC_LOADED(bp) && !NO_FCOE(bp)) {
 		struct ethhdr *hdr = (struct ethhdr *)skb->data;
 		u16 ether_type = ntohs(hdr->h_proto);
@@ -3372,6 +3316,7 @@ static int bnx2x_poll(struct napi_struct *napi, int budget)
 
 #ifdef CONFIG_XEN_SME
 	char dbg_buff[DBG_BUF_SIZE];
+	int was_there_work = 0;
 #endif
 
 #ifdef BNX2X_STOP_ON_ERROR
@@ -3384,9 +3329,28 @@ static int bnx2x_poll(struct napi_struct *napi, int budget)
 		if (bnx2x_tx_queue_has_work(fp->txdata_ptr[cos]))
 			bnx2x_tx_int(bp, fp->txdata_ptr[cos]);
 
+#ifdef CONFIG_XEN_SME
+	rx_work_done = 0;
+	was_there_work = bnx2x_has_rx_work(fp);
+	if (was_there_work)
+		rx_work_done = bnx2x_rx_int(fp, budget);
+	DP(NETIF_MSG_INTR, "POLL: [fp %d fw_sd %d igusb %d]\n"
+		", bd_prod: %u (%u) bd_cons: %u (%u) sw_comp_prod: %u sw_comp_cons: %u\n"
+		", rx_pkt: %d, budget: %d, n.poll_list empty: %d"
+		, fp->index, fp->fw_sb_id, fp->igu_sb_id
+		, fp->rx_bd_prod, (unsigned int) RX_BD(fp->rx_bd_prod)
+		, fp->rx_bd_cons, (unsigned int) RX_BD(fp->rx_bd_cons)
+		, fp->rx_comp_prod, fp->rx_comp_cons
+		, rx_work_done, budget, list_empty(&napi->poll_list) ? 1 : 0);
+#else
 	rx_work_done = (bnx2x_has_rx_work(fp)) ? bnx2x_rx_int(fp, budget) : 0;
+#endif
 
+#ifdef CONFIG_XEN_SME
+	if (rx_work_done <= budget) {
+#else
 	if (rx_work_done < budget) {
+#endif
 		/* No need to update SB for FCoE L2 ring as long as
 		 * it's connected to the default SB and the SB
 		 * has been updated when NAPI was scheduled.
@@ -3410,32 +3374,50 @@ static int bnx2x_poll(struct napi_struct *napi, int budget)
 			 */
 			rmb();
 
-			if (!(bnx2x_has_rx_work(fp) || bnx2x_has_tx_work(fp))) {
-				napi_complete(napi);
-				/* Re-enable interrupts */
 #ifdef CONFIG_XEN_SME
-				if (bp->msg_enable & NETIF_MSG_RX_STATUS) {
-					memset(dbg_buff, 0, DBG_BUF_SIZE);
-					sprintf(dbg_buff,
-				   "[%s:%d(%s)] Update index to %d [fp %d fw_sd %d igusb %d], "
-					 "bd_prod: %u bd_cons: %u sw_comp_prod: %u sw_comp_cons: %u, "
-					 "rx_work_done: %d, budget: %d, NAPI wt: %d\n"
-					 , __func__, __LINE__, (bp->dev ? bp->dev->name : "?"), fp->fp_hc_idx
+			if (lnk_intercept_rx_path) {
+				if (!bnx2x_has_tx_work(fp)) {
+					napi_complete(napi);
+					/* Always re-enable interrupts even if there is outstanding Rx work */
+
+					if (!was_there_work)
+						xsl_parse_rx_data(bp->dev, fp->index, RX_BD(fp->rx_bd_prod),
+								RX_BD(fp->rx_bd_cons),fp->rx_comp_prod, fp->rx_comp_cons,
+								NULL, 0, dbg_buff);
+
+					DP(NETIF_MSG_INTR,
+					 "Update index to %d [fp %d fw_sd %d igusb %d]\n"
+					 "bd_prod: %u (%u) bd_cons: %u (%u) sw_comp_prod: %u sw_comp_cons: %u\n"
+					 "rx_work_done: %d, was_there_work: %d, budget: %d, NAPI wt: %d\n"
+					 , fp->fp_hc_idx
 					 , fp->index, fp->fw_sb_id, fp->igu_sb_id
-					 , fp->rx_bd_prod, fp->rx_bd_cons, fp->rx_comp_prod, fp->rx_comp_cons
-					 , rx_work_done, budget, napi->weight);
-					xsl_print_sk_buff(NULL, dbg_buff);
+					 , fp->rx_bd_prod, (unsigned int) RX_BD(fp->rx_bd_prod)
+					 , fp->rx_bd_cons, (unsigned int) RX_BD(fp->rx_bd_cons)
+					 , fp->rx_comp_prod, fp->rx_comp_cons
+					 , rx_work_done, was_there_work, budget, napi->weight);
+
+					bnx2x_ack_sb(bp, fp->igu_sb_id, USTORM_ID,
+								 le16_to_cpu(fp->fp_hc_idx),
+								 IGU_INT_ENABLE, 1);
+				} else {
+					rx_work_done = budget;
 				}
-#else
-				DP(NETIF_MSG_RX_STATUS,
-				   "Update index to %d\n", fp->fp_hc_idx);
-#endif
-				bnx2x_ack_sb(bp, fp->igu_sb_id, USTORM_ID,
-					     le16_to_cpu(fp->fp_hc_idx),
-					     IGU_INT_ENABLE, 1);
 			} else {
-				rx_work_done = budget;
+#endif
+				if (!(bnx2x_has_rx_work(fp) || bnx2x_has_tx_work(fp))) {
+					napi_complete(napi);
+					/* Re-enable interrupts */
+					DP(NETIF_MSG_RX_STATUS,
+						 "Update index to %d\n", fp->fp_hc_idx);
+					bnx2x_ack_sb(bp, fp->igu_sb_id, USTORM_ID,
+								 le16_to_cpu(fp->fp_hc_idx),
+								 IGU_INT_ENABLE, 1);
+				} else {
+					rx_work_done = budget;
+				}
+#ifdef CONFIG_XEN_SME
 			}
+#endif
 		}
 	}
 
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h
index 7a2fdf59b..2c2fb2b19 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h
@@ -511,12 +511,6 @@ static inline void bnx2x_update_rx_prod(struct bnx2x *bp,
 {
 	struct ustorm_eth_rx_producers rx_prods = {0};
 	u32 i;
-#if 0
-#ifdef CONFIG_XEN_SME
-	char dbg_buff[DBG_BUF_SIZE];
-	memset(dbg_buff, 0, DBG_BUF_SIZE);
-#endif
-#endif
 
 	/* Update producers */
 	rx_prods.bd_prod = bd_prod;
@@ -538,20 +532,9 @@ static inline void bnx2x_update_rx_prod(struct bnx2x *bp,
 
 	mmiowb(); /* keep prod updates ordered */
 
-#ifdef CONFIG_XEN_SME
-#if 0
-	if (bp->msg_enable & NETIF_MSG_RX_STATUS) {
-		sprintf(dbg_buff, "[%s:%d(%s)] queue[%d]: wrote bd_prod %u cqe_prod %u sge_prod %u"
-				, __func__, __LINE__, (bp->dev ? bp->dev->name : "?")
-				, fp->index, bd_prod, rx_comp_prod, rx_sge_prod);
-		xsl_print_sk_buff(NULL, dbg_buff);
-	}
-#endif
-#else
 	DP(NETIF_MSG_RX_STATUS,
 	   "queue[%d]:  wrote  bd_prod %u  cqe_prod %u  sge_prod %u\n",
 	   fp->index, bd_prod, rx_comp_prod, rx_sge_prod);
-#endif
 }
 
 /* reload helper */
-- 
GitLab