Signed-off-by: Wenzhuo Lu <wenzhuo...@intel.com>
---
 drivers/net/ice/ice_rxtx.c          | 10 ++++--
 drivers/net/ice/ice_rxtx.h          |  3 ++
 drivers/net/ice/ice_rxtx_vec_avx2.c | 63 +++++++++++++++++++++++++++++++++++++
 3 files changed, 73 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ice/ice_rxtx.c b/drivers/net/ice/ice_rxtx.c
index 342e8f1..465d389 100644
--- a/drivers/net/ice/ice_rxtx.c
+++ b/drivers/net/ice/ice_rxtx.c
@@ -1495,7 +1495,8 @@
 #ifdef RTE_LIBRTE_ICE_INC_VECTOR
        if (dev->rx_pkt_burst == ice_recv_pkts_vec ||
            dev->rx_pkt_burst == ice_recv_scattered_pkts_vec ||
-           dev->rx_pkt_burst == ice_recv_pkts_vec_avx2)
+           dev->rx_pkt_burst == ice_recv_pkts_vec_avx2 ||
+           dev->rx_pkt_burst == ice_recv_scattered_pkts_vec_avx2)
                return ptypes;
 #endif
 
@@ -2252,9 +2253,12 @@ void __attribute__((cold))
 #endif
                if (dev->data->scattered_rx) {
                        PMD_DRV_LOG(DEBUG,
-                                   "Using Vector Scattered Rx (port %d).",
+                                   "Using %sVector Scattered Rx (port %d).",
+                                   use_avx2 ? "avx2 " : "",
                                    dev->data->port_id);
-                       dev->rx_pkt_burst = ice_recv_scattered_pkts_vec;
+                       dev->rx_pkt_burst = use_avx2 ?
+                                           ice_recv_scattered_pkts_vec_avx2 :
+                                           ice_recv_scattered_pkts_vec;
                } else {
                        PMD_DRV_LOG(DEBUG, "Using %sVector Rx (port %d).",
                                    use_avx2 ? "avx2 " : "",
diff --git a/drivers/net/ice/ice_rxtx.h b/drivers/net/ice/ice_rxtx.h
index 63c552c..a918646 100644
--- a/drivers/net/ice/ice_rxtx.h
+++ b/drivers/net/ice/ice_rxtx.h
@@ -184,5 +184,8 @@ uint16_t ice_xmit_pkts_vec(void *tx_queue, struct rte_mbuf 
**tx_pkts,
                           uint16_t nb_pkts);
 uint16_t ice_recv_pkts_vec_avx2(void *rx_queue, struct rte_mbuf **rx_pkts,
                                uint16_t nb_pkts);
+uint16_t ice_recv_scattered_pkts_vec_avx2(void *rx_queue,
+                                         struct rte_mbuf **rx_pkts,
+                                         uint16_t nb_pkts);
 #endif
 #endif /* _ICE_RXTX_H_ */
diff --git a/drivers/net/ice/ice_rxtx_vec_avx2.c 
b/drivers/net/ice/ice_rxtx_vec_avx2.c
index f9cce2e..78dda2f 100644
--- a/drivers/net/ice/ice_rxtx_vec_avx2.c
+++ b/drivers/net/ice/ice_rxtx_vec_avx2.c
@@ -546,3 +546,66 @@
 {
        return _recv_raw_pkts_vec_avx2(rx_queue, rx_pkts, nb_pkts, NULL);
 }
+
+/**
+ * vPMD receive routine that reassembles single burst of 32 scattered packets
+ * Notice:
+ * - nb_pkts < ICE_DESCS_PER_LOOP, just return no packet
+ */
+static uint16_t
+ice_recv_scattered_burst_vec_avx2(void *rx_queue, struct rte_mbuf **rx_pkts,
+                                 uint16_t nb_pkts)
+{
+       struct ice_rx_queue *rxq = rx_queue;
+       uint8_t split_flags[ICE_VPMD_RX_BURST] = {0};
+
+       /* get some new buffers */
+       uint16_t nb_bufs = _recv_raw_pkts_vec_avx2(rxq, rx_pkts, nb_pkts,
+                       split_flags);
+       if (nb_bufs == 0)
+               return 0;
+
+       /* happy day case, full burst + no packets to be joined */
+       const uint64_t *split_fl64 = (uint64_t *)split_flags;
+
+       if (rxq->pkt_first_seg == NULL &&
+                       split_fl64[0] == 0 && split_fl64[1] == 0 &&
+                       split_fl64[2] == 0 && split_fl64[3] == 0)
+               return nb_bufs;
+
+       /* reassemble any packets that need reassembly*/
+       unsigned int i = 0;
+
+       if (rxq->pkt_first_seg == NULL) {
+               /* find the first split flag, and only reassemble then*/
+               while (i < nb_bufs && !split_flags[i])
+                       i++;
+               if (i == nb_bufs)
+                       return nb_bufs;
+       }
+       return i + reassemble_packets(rxq, &rx_pkts[i], nb_bufs - i,
+               &split_flags[i]);
+}
+
+/*
+ * vPMD receive routine that reassembles scattered packets.
+ * Main receive routine that can handle arbitrary burst sizes
+ * Notice:
+ * - nb_pkts < ICE_DESCS_PER_LOOP, just return no packet
+ */
+uint16_t
+ice_recv_scattered_pkts_vec_avx2(void *rx_queue, struct rte_mbuf **rx_pkts,
+                                uint16_t nb_pkts)
+{
+       uint16_t retval = 0;
+       while (nb_pkts > ICE_VPMD_RX_BURST) {
+               uint16_t burst = ice_recv_scattered_burst_vec_avx2(rx_queue,
+                               rx_pkts + retval, ICE_VPMD_RX_BURST);
+               retval += burst;
+               nb_pkts -= burst;
+               if (burst < ICE_VPMD_RX_BURST)
+                       return retval;
+       }
+       return retval + ice_recv_scattered_burst_vec_avx2(rx_queue,
+                               rx_pkts + retval, nb_pkts);
+}
-- 
1.9.3

Reply via email to