net/i40e: fix descriptor scan on Arm
authorJoyce Kong <joyce.kong@arm.com>
Tue, 6 Jul 2021 06:54:03 +0000 (01:54 -0500)
committerQi Zhang <qi.z.zhang@intel.com>
Fri, 9 Jul 2021 03:05:19 +0000 (05:05 +0200)
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.

Fixes: 4861cde46116 ("i40e: new poll mode driver")
Cc: stable@dpdk.org
Signed-off-by: Joyce Kong <joyce.kong@arm.com>
Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
drivers/net/i40e/i40e_rxtx.c

index 8d65f28..e518409 100644 (file)
@@ -452,7 +452,7 @@ i40e_rx_scan_hw_ring(struct i40e_rx_queue *rxq)
        uint16_t pkt_len;
        uint64_t qword1;
        uint32_t rx_status;
-       int32_t s[I40E_LOOK_AHEAD], nb_dd;
+       int32_t s[I40E_LOOK_AHEAD], var, nb_dd;
        int32_t i, j, nb_rx = 0;
        uint64_t pkt_flags;
        uint32_t *ptype_tbl = rxq->vsi->adapter->ptype_tbl;
@@ -485,8 +485,18 @@ i40e_rx_scan_hw_ring(struct i40e_rx_queue *rxq)
                rte_smp_rmb();
 
                /* Compute how many status bits were set */
-               for (j = 0, nb_dd = 0; j < I40E_LOOK_AHEAD; j++)
-                       nb_dd += s[j] & (1 << I40E_RX_DESC_STATUS_DD_SHIFT);
+               for (j = 0, nb_dd = 0; j < I40E_LOOK_AHEAD; j++) {
+                       var = s[j] & (1 << I40E_RX_DESC_STATUS_DD_SHIFT);
+#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;