net/bnxt: optimize Rx processing
authorAjit Khaparde <ajit.khaparde@broadcom.com>
Thu, 28 Jun 2018 20:15:29 +0000 (13:15 -0700)
committerFerruh Yigit <ferruh.yigit@intel.com>
Mon, 2 Jul 2018 23:35:58 +0000 (01:35 +0200)
1) Use nb_rx_pkts instead of checking producer indices of Rx and
aggregator rings to decide if any Rx completions were processed.
2) Post Rx buffers early in Rx processing instead of waiting for
the budgeted burst quota.
3) Ring Rx CQ DB after Rx buffers are posted.

Signed-off-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
drivers/net/bnxt/bnxt_rxr.c
drivers/net/bnxt/bnxt_rxr.h

index 9d88429..b6b72c5 100644 (file)
@@ -540,8 +540,8 @@ uint16_t bnxt_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
        int rc = 0;
        bool evt = false;
 
-       /* If Rx Q was stopped return */
-       if (rxq->rx_deferred_start)
+       /* If Rx Q was stopped return. RxQ0 cannot be stopped. */
+       if (rxq->rx_deferred_start && rxq->queue_id)
                return 0;
 
        /* Handle RX burst request */
@@ -572,10 +572,13 @@ uint16_t bnxt_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
                raw_cons = NEXT_RAW_CMP(raw_cons);
                if (nb_rx_pkts == nb_pkts || evt)
                        break;
+               /* Post some Rx buf early in case of larger burst processing */
+               if (nb_rx_pkts == BNXT_RX_POST_THRESH)
+                       B_RX_DB(rxr->rx_doorbell, rxr->rx_prod);
        }
 
        cpr->cp_raw_cons = raw_cons;
-       if ((prod == rxr->rx_prod && ag_prod == rxr->ag_prod) && !evt) {
+       if (!nb_rx_pkts && !evt) {
                /*
                 * For PMD, there is no need to keep on pushing to REARM
                 * the doorbell if there are no new completions
@@ -583,7 +586,6 @@ uint16_t bnxt_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
                return nb_rx_pkts;
        }
 
-       B_CP_DIS_DB(cpr, cpr->cp_raw_cons);
        if (prod != rxr->rx_prod)
                B_RX_DB(rxr->rx_doorbell, rxr->rx_prod);
 
@@ -591,6 +593,8 @@ uint16_t bnxt_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
        if (ag_prod != rxr->ag_prod)
                B_RX_DB(rxr->ag_doorbell, rxr->ag_prod);
 
+       B_CP_DIS_DB(cpr, cpr->cp_raw_cons);
+
        /* Attempt to alloc Rx buf in case of a previous allocation failure. */
        if (rc == -ENOMEM) {
                int i;
index 5b28f03..3815a21 100644 (file)
@@ -54,6 +54,8 @@
 #define RX_CMP_IP_CS_UNKNOWN(rxcmp1)                                   \
                !((rxcmp1)->flags2 & RX_CMP_IP_CS_BITS)
 
+#define BNXT_RX_POST_THRESH    32
+
 enum pkt_hash_types {
        PKT_HASH_TYPE_NONE,     /* Undefined type */
        PKT_HASH_TYPE_L2,       /* Input: src_MAC, dest_MAC */