summaryrefslogtreecommitdiff
path: root/drivers/net/qede/qede_rxtx.c
diff options
context:
space:
mode:
authorShahed Shaikh <shshaikh@marvell.com>2019-03-12 09:51:14 -0700
committerFerruh Yigit <ferruh.yigit@intel.com>2019-03-20 18:15:42 +0100
commit3732f83a45f5ee7b45d7655a15150f665841ce53 (patch)
treeba092353ae6dd46e651eebbce74f4d75328b876f /drivers/net/qede/qede_rxtx.c
parent7065dff68e9af69d3752ca3f514971d98fc26fbc (diff)
downloaddpdk-3732f83a45f5ee7b45d7655a15150f665841ce53.zip
dpdk-3732f83a45f5ee7b45d7655a15150f665841ce53.tar.gz
dpdk-3732f83a45f5ee7b45d7655a15150f665841ce53.tar.xz
net/qede: fix Rx packet drop
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>
Diffstat (limited to 'drivers/net/qede/qede_rxtx.c')
-rw-r--r--drivers/net/qede/qede_rxtx.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/drivers/net/qede/qede_rxtx.c b/drivers/net/qede/qede_rxtx.c
index 70c32e3..27bac09 100644
--- a/drivers/net/qede/qede_rxtx.c
+++ b/drivers/net/qede/qede_rxtx.c
@@ -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;