[dpdk-stable] patch 'net/ixgbe: support packet type with NEON' has been queued to LTS release 17.11.10

luca.boccassi at gmail.com luca.boccassi at gmail.com
Thu Dec 19 15:34:19 CET 2019


Hi,

FYI, your patch has been queued to LTS release 17.11.10

Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet.
It will be pushed if I get no objections before 12/21/19. So please
shout if anyone has objections.

Also note that after the patch there's a diff of the upstream commit vs the
patch applied to the branch. This will indicate if there was any rebasing
needed to apply to the stable branch. If there were code changes for rebasing
(ie: not only metadata diffs), please double check that the rebase was
correctly done.

Thanks.

Luca Boccassi

---
>From 3a9454f74848a4ca6f36f36b16272b7d3a50c4f1 Mon Sep 17 00:00:00 2001
From: Ruifeng Wang <ruifeng.wang at arm.com>
Date: Thu, 24 Oct 2019 10:58:02 +0800
Subject: [PATCH] net/ixgbe: support packet type with NEON

[ upstream commit 41fdc03e72c55ac7f28f0d52f3c1935a19015180 ]

Ptype parse is missing in aarch64 vector PMD. It makes packet type info
provided by NIC get lost, thus requires extra CPU cycles to do this.
Add the parse process to utilize NIC hardware capability.

In test with l3fwd (removed port conf DEV_RX_OFFLOAD_CHECKSUM),
observed over 3% performance gain.

Fixes: b20971b6cca0 ("net/ixgbe: implement vector driver for ARM")

Signed-off-by: Ruifeng Wang <ruifeng.wang at arm.com>
Reviewed-by: Gavin Hu <gavin.hu at arm.com>
Reviewed-by: Ferruh Yigit <ferruh.yigit at intel.com>
---
 drivers/net/ixgbe/ixgbe_ethdev.c        |  2 +-
 drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c | 64 +++++++++++++++++++++++++
 2 files changed, 65 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index 6f8cfd9b00..ca7109e6f0 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -3822,7 +3822,7 @@ ixgbe_dev_supported_ptypes_get(struct rte_eth_dev *dev)
 	    dev->rx_pkt_burst == ixgbe_recv_pkts_bulk_alloc)
 		return ptypes;
 
-#if defined(RTE_ARCH_X86)
+#if defined(RTE_ARCH_X86) || defined(RTE_MACHINE_CPUFLAG_NEON)
 	if (dev->rx_pkt_burst == ixgbe_recv_pkts_vec ||
 	    dev->rx_pkt_burst == ixgbe_recv_scattered_pkts_vec)
 		return ptypes;
diff --git a/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c b/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
index 0b38d97fa0..fd01d97e6f 100644
--- a/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
+++ b/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
@@ -174,6 +174,68 @@ desc_to_olflags_v(uint8x16x2_t sterr_tmp1, uint8x16x2_t sterr_tmp2,
 #define IXGBE_VPMD_DESC_DD_MASK		0x01010101
 #define IXGBE_VPMD_DESC_EOP_MASK	0x02020202
 
+static inline uint32_t
+get_packet_type(uint32_t pkt_info,
+		uint32_t etqf_check,
+		uint32_t tunnel_check)
+{
+	if (etqf_check)
+		return RTE_PTYPE_UNKNOWN;
+
+	if (tunnel_check) {
+		pkt_info &= IXGBE_PACKET_TYPE_MASK_TUNNEL;
+		return ptype_table_tn[pkt_info];
+	}
+
+	pkt_info &= IXGBE_PACKET_TYPE_MASK_82599;
+	return ptype_table[pkt_info];
+}
+
+static inline void
+desc_to_ptype_v(uint64x2_t descs[4], uint16_t pkt_type_mask,
+		struct rte_mbuf **rx_pkts)
+{
+	uint32x4_t etqf_check, tunnel_check;
+	uint32x4_t etqf_mask = vdupq_n_u32(0x8000);
+	uint32x4_t tunnel_mask = vdupq_n_u32(0x10000);
+	uint32x4_t ptype_mask = vdupq_n_u32((uint32_t)pkt_type_mask);
+	uint32x4_t ptype0 = vzipq_u32(vreinterpretq_u32_u64(descs[0]),
+				vreinterpretq_u32_u64(descs[2])).val[0];
+	uint32x4_t ptype1 = vzipq_u32(vreinterpretq_u32_u64(descs[1]),
+				vreinterpretq_u32_u64(descs[3])).val[0];
+
+	/* interleave low 32 bits,
+	 * now we have 4 ptypes in a NEON register
+	 */
+	ptype0 = vzipq_u32(ptype0, ptype1).val[0];
+
+	/* mask etqf bits */
+	etqf_check = vandq_u32(ptype0, etqf_mask);
+	/* mask tunnel bits */
+	tunnel_check = vandq_u32(ptype0, tunnel_mask);
+
+	/* shift right by IXGBE_PACKET_TYPE_SHIFT, and apply ptype mask */
+	ptype0 = vandq_u32(vshrq_n_u32(ptype0, IXGBE_PACKET_TYPE_SHIFT),
+			ptype_mask);
+
+	rx_pkts[0]->packet_type =
+		get_packet_type(vgetq_lane_u32(ptype0, 0),
+				vgetq_lane_u32(etqf_check, 0),
+				vgetq_lane_u32(tunnel_check, 0));
+	rx_pkts[1]->packet_type =
+		get_packet_type(vgetq_lane_u32(ptype0, 1),
+				vgetq_lane_u32(etqf_check, 1),
+				vgetq_lane_u32(tunnel_check, 1));
+	rx_pkts[2]->packet_type =
+		get_packet_type(vgetq_lane_u32(ptype0, 2),
+				vgetq_lane_u32(etqf_check, 2),
+				vgetq_lane_u32(tunnel_check, 2));
+	rx_pkts[3]->packet_type =
+		get_packet_type(vgetq_lane_u32(ptype0, 3),
+				vgetq_lane_u32(etqf_check, 3),
+				vgetq_lane_u32(tunnel_check, 3));
+}
+
 static inline uint16_t
 _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
 		   uint16_t nb_pkts, uint8_t *split_packet)
@@ -325,6 +387,8 @@ _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
 		vst1q_u8((uint8_t *)&rx_pkts[pos]->rx_descriptor_fields1,
 			 pkt_mb1);
 
+		desc_to_ptype_v(descs, rxq->pkt_type_mask, &rx_pkts[pos]);
+
 		stat &= IXGBE_VPMD_DESC_DD_MASK;
 
 		/* C.4 calc avaialbe number of desc */
-- 
2.20.1

---
  Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- -	2019-12-19 14:32:30.771234016 +0000
+++ 0112-net-ixgbe-support-packet-type-with-NEON.patch	2019-12-19 14:32:26.277301236 +0000
@@ -1,8 +1,10 @@
-From 41fdc03e72c55ac7f28f0d52f3c1935a19015180 Mon Sep 17 00:00:00 2001
+From 3a9454f74848a4ca6f36f36b16272b7d3a50c4f1 Mon Sep 17 00:00:00 2001
 From: Ruifeng Wang <ruifeng.wang at arm.com>
 Date: Thu, 24 Oct 2019 10:58:02 +0800
 Subject: [PATCH] net/ixgbe: support packet type with NEON
 
+[ upstream commit 41fdc03e72c55ac7f28f0d52f3c1935a19015180 ]
+
 Ptype parse is missing in aarch64 vector PMD. It makes packet type info
 provided by NIC get lost, thus requires extra CPU cycles to do this.
 Add the parse process to utilize NIC hardware capability.
@@ -11,7 +13,6 @@
 observed over 3% performance gain.
 
 Fixes: b20971b6cca0 ("net/ixgbe: implement vector driver for ARM")
-Cc: stable at dpdk.org
 
 Signed-off-by: Ruifeng Wang <ruifeng.wang at arm.com>
 Reviewed-by: Gavin Hu <gavin.hu at arm.com>
@@ -22,10 +23,10 @@
  2 files changed, 65 insertions(+), 1 deletion(-)
 
 diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
-index dbce7a80e9..3c7624f3a1 100644
+index 6f8cfd9b00..ca7109e6f0 100644
 --- a/drivers/net/ixgbe/ixgbe_ethdev.c
 +++ b/drivers/net/ixgbe/ixgbe_ethdev.c
-@@ -3908,7 +3908,7 @@ ixgbe_dev_supported_ptypes_get(struct rte_eth_dev *dev)
+@@ -3822,7 +3822,7 @@ ixgbe_dev_supported_ptypes_get(struct rte_eth_dev *dev)
  	    dev->rx_pkt_burst == ixgbe_recv_pkts_bulk_alloc)
  		return ptypes;
  
@@ -35,12 +36,12 @@
  	    dev->rx_pkt_burst == ixgbe_recv_scattered_pkts_vec)
  		return ptypes;
 diff --git a/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c b/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
-index 26c0ef5aec..ee11fab96a 100644
+index 0b38d97fa0..fd01d97e6f 100644
 --- a/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
 +++ b/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
-@@ -146,6 +146,68 @@ desc_to_olflags_v(uint8x16x2_t sterr_tmp1, uint8x16x2_t sterr_tmp2,
+@@ -174,6 +174,68 @@ desc_to_olflags_v(uint8x16x2_t sterr_tmp1, uint8x16x2_t sterr_tmp2,
+ #define IXGBE_VPMD_DESC_DD_MASK		0x01010101
  #define IXGBE_VPMD_DESC_EOP_MASK	0x02020202
- #define IXGBE_UINT8_BIT			(CHAR_BIT * sizeof(uint8_t))
  
 +static inline uint32_t
 +get_packet_type(uint32_t pkt_info,
@@ -107,15 +108,15 @@
  static inline uint16_t
  _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
  		   uint16_t nb_pkts, uint8_t *split_packet)
-@@ -303,6 +365,8 @@ _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
+@@ -325,6 +387,8 @@ _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
  		vst1q_u8((uint8_t *)&rx_pkts[pos]->rx_descriptor_fields1,
  			 pkt_mb1);
  
 +		desc_to_ptype_v(descs, rxq->pkt_type_mask, &rx_pkts[pos]);
 +
- 		/* C.5 calc available number of desc */
- 		if (unlikely(stat == 0)) {
- 			nb_pkts_recd += RTE_IXGBE_DESCS_PER_LOOP;
+ 		stat &= IXGBE_VPMD_DESC_DD_MASK;
+ 
+ 		/* C.4 calc avaialbe number of desc */
 -- 
 2.20.1
 


More information about the stable mailing list