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