net/qede: fix Rx packet drop
authorShahed Shaikh <shshaikh@marvell.com>
Tue, 12 Mar 2019 16:51:14 +0000 (09:51 -0700)
committerFerruh Yigit <ferruh.yigit@intel.com>
Wed, 20 Mar 2019 17:15:42 +0000 (18:15 +0100)
There is a corner case in which driver won't post
receive buffers when driver has processed all received packets
in single loop (i.e. hw_consumer == sw_consumer) and then
HW will start dropping packets since it did not see new receive
buffers posted.

This corner case is seen when size of Rx ring is less than or equals
Rx packet burst count for dev->rx_pkt_burst().

Fixes: 8f2312474529 ("net/qede: fix performance bottleneck in Rx path")
Cc: stable@dpdk.org
Signed-off-by: Shahed Shaikh <shshaikh@marvell.com>
Acked-by: Rasesh Mody <rmody@marvell.com>
drivers/net/qede/qede_rxtx.c

index 70c32e3..27bac09 100644 (file)
@@ -1420,13 +1420,6 @@ qede_recv_pkts(void *p_rxq, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
        uint32_t rss_hash;
        int rx_alloc_count = 0;
 
-       hw_comp_cons = rte_le_to_cpu_16(*rxq->hw_cons_ptr);
-       sw_comp_cons = ecore_chain_get_cons_idx(&rxq->rx_comp_ring);
-
-       rte_rmb();
-
-       if (hw_comp_cons == sw_comp_cons)
-               return 0;
 
        /* Allocate buffers that we used in previous loop */
        if (rxq->rx_alloc_count) {
@@ -1447,6 +1440,14 @@ qede_recv_pkts(void *p_rxq, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
                rxq->rx_alloc_count = 0;
        }
 
+       hw_comp_cons = rte_le_to_cpu_16(*rxq->hw_cons_ptr);
+       sw_comp_cons = ecore_chain_get_cons_idx(&rxq->rx_comp_ring);
+
+       rte_rmb();
+
+       if (hw_comp_cons == sw_comp_cons)
+               return 0;
+
        while (sw_comp_cons != hw_comp_cons) {
                ol_flags = 0;
                packet_type = RTE_PTYPE_UNKNOWN;