From: Yuhailong <[email protected]>

This patch borrows i40 patch:
commit 65b2ec7b4f6b ("net/i40e: fix descriptor scan on Arm")

For Arm platforms, reading descs can get re-ordered, then the status
of DD bits will be discontinuous, so add the logic to only process
continuous descs by checking DD bits.

Cc: Joyce Kong <[email protected]>
Cc: Ruifeng Wang <[email protected]>

Signed-off-by: Yuhailong <[email protected]>
Signed-off-by: Jianhua Xie <[email protected]>
---
 drivers/net/intel/ice/ice_rxtx.c | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

diff --git a/drivers/net/intel/ice/ice_rxtx.c b/drivers/net/intel/ice/ice_rxtx.c
index 74db0fbec9..b9358e49ba 100644
--- a/drivers/net/intel/ice/ice_rxtx.c
+++ b/drivers/net/intel/ice/ice_rxtx.c
@@ -1888,7 +1888,7 @@ ice_rx_scan_hw_ring(struct ci_rx_queue *rxq)
        struct rte_mbuf *mb;
        uint16_t stat_err0;
        uint16_t pkt_len, hdr_len;
-       int32_t s[ICE_LOOK_AHEAD], nb_dd;
+       int32_t s[ICE_LOOK_AHEAD], nb_dd, var = 0;
        int32_t i, j, nb_rx = 0;
        uint64_t pkt_flags = 0;
        uint32_t *ptype_tbl = rxq->ice_vsi->adapter->ptype_tbl;
@@ -1930,8 +1930,18 @@ ice_rx_scan_hw_ring(struct ci_rx_queue *rxq)
                rte_smp_rmb();
 
                /* Compute how many status bits were set */
-               for (j = 0, nb_dd = 0; j < ICE_LOOK_AHEAD; j++)
-                       nb_dd += s[j] & (1 << ICE_RX_FLEX_DESC_STATUS0_DD_S);
+               for (j = 0, nb_dd = 0; j < ICE_LOOK_AHEAD; j++) {
+                       var = s[j] & (1 << ICE_RX_FLEX_DESC_STATUS0_DD_S);
+#ifdef RTE_ARCH_ARM
+                       /* For Arm platforms, only compute continuous status 
bits */
+                       if (var)
+                               nb_dd += 1;
+                       else
+                               break;
+#else
+                       nb_dd += var;
+#endif
+               }
 
                nb_rx += nb_dd;
 
-- 
2.30.2

Reply via email to