DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH] ixgbe: support checksum flags in sse vector Rx function
@ 2016-07-07 12:19 Olivier Matz
  2016-07-08 20:42 ` Bruce Richardson
                   ` (3 more replies)
  0 siblings, 4 replies; 8+ messages in thread
From: Olivier Matz @ 2016-07-07 12:19 UTC (permalink / raw)
  To: dev, konstantin.ananyev, helin.zhang; +Cc: bruce.richardson, Maxime Leroy

Update desc_to_olflags_v() to set PKT_RX_IP_CKSUM_BAD and
PKT_RX_L4_CKSUM_BAD in the ol_fags of the mbuf.

The Rx vector function can now be used with hw_ip_checksum
enabled.

Tested with:

  cd dpdk.org/
  make config T=x86_64-native-linuxapp-gcc
  make -j32
  mkdir -p /mnt/huge
  mount -t hugetlbfs nodev /mnt/huge
  echo 256 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
  modprobe uio_pci_generic
  python tools/dpdk_nic_bind.py -b uio_pci_generic 0000:04:00.0
  ./build/app/testpmd -l 2,4 -- --total-num-mbufs=65536 -i --port-topology=chained --enable-rx-cksum --disable-hw-vlan-filter --disable-hw-vlan-strip
    set fwd rxonly
    set verbose 1
    start

  # send packets to testpmd using scapy
  eh = Ether(src="00:01:02:03:04:05", dst="00:1B:21:AB:8F:10")
  p = Ether()/IP(src="1.1.1.1", dst="1.1.1.2")/UDP()/Raw("x"*50)
  sendp(p, iface="ixgbe2")
  p = Ether()/IP(src="1.1.1.1", dst="1.1.1.2", chksum=42)/UDP()/Raw("x"*50)
  sendp(p, iface="ixgbe2")
  p = Ether()/IP(src="1.1.1.1", dst="1.1.1.2")/UDP(chksum=42)/Raw("x"*50)
  sendp(p, iface="ixgbe2")
  p = Ether()/IP(src="1.1.1.1", dst="1.1.1.2", chksum=45)/UDP(chksum=42)/Raw("x"*50)
  sendp(p, iface="ixgbe2")

  # result
  port 0/queue 0: received 1 packets
    src=00:01:02:03:04:05 - dst=00:1B:21:AB:8F:10 - type=0x0800 - length=92 - nb_segs=1Unknown packet type
   - Receive queue=0x0
  port 0/queue 0: received 1 packets
    src=00:01:02:03:04:05 - dst=00:1B:21:AB:8F:10 - type=0x0800 - length=92 - nb_segs=1Unknown packet type
   - Receive queue=0x0
    PKT_RX_IP_CKSUM_BAD
  port 0/queue 0: received 1 packets
    src=00:01:02:03:04:05 - dst=00:1B:21:AB:8F:10 - type=0x0800 - length=92 - nb_segs=1Unknown packet type
   - Receive queue=0x0
    PKT_RX_L4_CKSUM_BAD
  port 0/queue 0: received 1 packets
    src=00:01:02:03:04:05 - dst=00:1B:21:AB:8F:10 - type=0x0800 - length=92 - nb_segs=1Unknown packet type
   - Receive queue=0x0
    PKT_RX_L4_CKSUM_BAD
    PKT_RX_IP_CKSUM_BAD

Signed-off-by: Maxime Leroy <maxime.leroy@6wind.com>
Signed-off-by: Olivier Matz <olivier.matz@6wind.com>
---
 drivers/net/ixgbe/ixgbe_rxtx_vec_common.h |  8 ++---
 drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c   |  6 ++++
 drivers/net/ixgbe/ixgbe_rxtx_vec_sse.c    | 50 +++++++++++++++++++++----------
 3 files changed, 42 insertions(+), 22 deletions(-)

diff --git a/drivers/net/ixgbe/ixgbe_rxtx_vec_common.h b/drivers/net/ixgbe/ixgbe_rxtx_vec_common.h
index 62b8201..05f8185 100644
--- a/drivers/net/ixgbe/ixgbe_rxtx_vec_common.h
+++ b/drivers/net/ixgbe/ixgbe_rxtx_vec_common.h
@@ -309,12 +309,8 @@ ixgbe_rx_vec_dev_conf_condition_check_default(struct rte_eth_dev *dev)
 	if (fconf->mode != RTE_FDIR_MODE_NONE)
 		return -1;
 
-	/*
-	 * - no csum error report support
-	 * - no header split support
-	 */
-	if (rxmode->hw_ip_checksum == 1 ||
-	    rxmode->header_split == 1)
+	/* no header split support */
+	if (rxmode->header_split == 1)
 		return -1;
 
 	return 0;
diff --git a/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c b/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
index 64a329e..f96cc85 100644
--- a/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
+++ b/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
@@ -556,5 +556,11 @@ ixgbe_txq_vec_setup(struct ixgbe_tx_queue *txq)
 int __attribute__((cold))
 ixgbe_rx_vec_dev_conf_condition_check(struct rte_eth_dev *dev)
 {
+	struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode;
+
+	/* no csum error report support */
+	if (rxmode->hw_ip_checksum == 1)
+		return -1;
+
 	return ixgbe_rx_vec_dev_conf_condition_check_default(dev);
 }
diff --git a/drivers/net/ixgbe/ixgbe_rxtx_vec_sse.c b/drivers/net/ixgbe/ixgbe_rxtx_vec_sse.c
index 1c4fd7c..dc5657e 100644
--- a/drivers/net/ixgbe/ixgbe_rxtx_vec_sse.c
+++ b/drivers/net/ixgbe/ixgbe_rxtx_vec_sse.c
@@ -145,7 +145,7 @@ static inline void
 desc_to_olflags_v(__m128i descs[4], uint8_t vlan_flags,
 	struct rte_mbuf **rx_pkts)
 {
-	__m128i ptype0, ptype1, vtag0, vtag1;
+	__m128i ptype0, ptype1, vtag0, vtag1, csum;
 	union {
 		uint16_t e[4];
 		uint64_t dword;
@@ -162,18 +162,26 @@ desc_to_olflags_v(__m128i descs[4], uint8_t vlan_flags,
 			PKT_RX_RSS_HASH, 0, PKT_RX_RSS_HASH, 0,
 			PKT_RX_RSS_HASH, PKT_RX_RSS_HASH, PKT_RX_RSS_HASH, 0);
 
-	/* mask everything except vlan present bit */
-	const __m128i vlan_msk = _mm_set_epi16(
-			0x0000, 0x0000,
-			0x0000, 0x0000,
-			IXGBE_RXD_STAT_VP, IXGBE_RXD_STAT_VP,
-			IXGBE_RXD_STAT_VP, IXGBE_RXD_STAT_VP);
-	/* map vlan present (0x8) to ol_flags */
-	const __m128i vlan_map = _mm_set_epi8(
+	/* mask everything except vlan present and l4/ip csum error */
+	const __m128i vlan_csum_msk = _mm_set_epi16(
+		(IXGBE_RXDADV_ERR_TCPE | IXGBE_RXDADV_ERR_IPE) >> 16,
+		(IXGBE_RXDADV_ERR_TCPE | IXGBE_RXDADV_ERR_IPE) >> 16,
+		(IXGBE_RXDADV_ERR_TCPE | IXGBE_RXDADV_ERR_IPE) >> 16,
+		(IXGBE_RXDADV_ERR_TCPE | IXGBE_RXDADV_ERR_IPE) >> 16,
+		IXGBE_RXD_STAT_VP, IXGBE_RXD_STAT_VP,
+		IXGBE_RXD_STAT_VP, IXGBE_RXD_STAT_VP);
+	/* map vlan present (0x8), IPE (0x2), L4E (0x1) to ol_flags */
+	const __m128i vlan_csum_map = _mm_set_epi8(
 		0, 0, 0, 0,
-		0, 0, 0, vlan_flags,
+		vlan_flags | PKT_RX_IP_CKSUM_BAD | PKT_RX_L4_CKSUM_BAD,
+		vlan_flags | PKT_RX_IP_CKSUM_BAD,
+		vlan_flags | PKT_RX_L4_CKSUM_BAD,
+		vlan_flags,
 		0, 0, 0, 0,
-		0, 0, 0, 0);
+		PKT_RX_IP_CKSUM_BAD | PKT_RX_L4_CKSUM_BAD,
+		PKT_RX_IP_CKSUM_BAD,
+		PKT_RX_L4_CKSUM_BAD,
+		0);
 
 	ptype0 = _mm_unpacklo_epi16(descs[0], descs[1]);
 	ptype1 = _mm_unpacklo_epi16(descs[2], descs[3]);
@@ -185,8 +193,21 @@ desc_to_olflags_v(__m128i descs[4], uint8_t vlan_flags,
 	ptype0 = _mm_shuffle_epi8(rss_flags, ptype0);
 
 	vtag1 = _mm_unpacklo_epi32(vtag0, vtag1);
-	vtag1 = _mm_and_si128(vtag1, vlan_msk);
-	vtag1 = _mm_shuffle_epi8(vlan_map, vtag1);
+	vtag1 = _mm_and_si128(vtag1, vlan_csum_msk);
+
+	/* csum bits are in the most significant, to use shuffle we need to
+	 * shift them. Change mask to 0xc000 to 0x0003.
+	 */
+	csum = _mm_srli_epi16(vtag1, 14);
+
+	/* now or the most significant 64 bits containing the checksum
+	 * flags with the vlan present flags.
+	 */
+	csum = _mm_srli_si128(csum, 8);
+	vtag1 = _mm_or_si128(csum, vtag1);
+
+	/* convert VP, IPE, L4E to ol_flags */
+	vtag1 = _mm_shuffle_epi8(vlan_csum_map, vtag1);
 
 	vtag1 = _mm_or_si128(ptype0, vtag1);
 	vol.dword = _mm_cvtsi128_si64(vtag1);
@@ -210,7 +231,6 @@ desc_to_olflags_v(__m128i descs[4], uint8_t vlan_flags,
  * - nb_pkts > RTE_IXGBE_MAX_RX_BURST, only scan RTE_IXGBE_MAX_RX_BURST
  *   numbers of DD bit
  * - floor align nb_pkts to a RTE_IXGBE_DESC_PER_LOOP power-of-two
- * - don't support ol_flags for rss and csum err
  */
 static inline uint16_t
 _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
@@ -425,7 +445,6 @@ _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
  * - nb_pkts > RTE_IXGBE_MAX_RX_BURST, only scan RTE_IXGBE_MAX_RX_BURST
  *   numbers of DD bit
  * - floor align nb_pkts to a RTE_IXGBE_DESC_PER_LOOP power-of-two
- * - don't support ol_flags for rss and csum err
  */
 uint16_t
 ixgbe_recv_pkts_vec(void *rx_queue, struct rte_mbuf **rx_pkts,
@@ -438,7 +457,6 @@ ixgbe_recv_pkts_vec(void *rx_queue, struct rte_mbuf **rx_pkts,
  * vPMD receive routine that reassembles scattered packets
  *
  * Notice:
- * - don't support ol_flags for rss and csum err
  * - nb_pkts < RTE_IXGBE_DESCS_PER_LOOP, just return no packet
  * - nb_pkts > RTE_IXGBE_MAX_RX_BURST, only scan RTE_IXGBE_MAX_RX_BURST
  *   numbers of DD bit
-- 
2.8.1

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [dpdk-dev] [PATCH] ixgbe: support checksum flags in sse vector Rx function
  2016-07-07 12:19 [dpdk-dev] [PATCH] ixgbe: support checksum flags in sse vector Rx function Olivier Matz
@ 2016-07-08 20:42 ` Bruce Richardson
  2016-07-10 17:41   ` Olivier Matz
  2016-07-14  9:24 ` Chandran, Sugesh
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 8+ messages in thread
From: Bruce Richardson @ 2016-07-08 20:42 UTC (permalink / raw)
  To: Olivier Matz; +Cc: dev, konstantin.ananyev, helin.zhang, Maxime Leroy

On Thu, Jul 07, 2016 at 02:19:02PM +0200, Olivier Matz wrote:
> Update desc_to_olflags_v() to set PKT_RX_IP_CKSUM_BAD and
> PKT_RX_L4_CKSUM_BAD in the ol_fags of the mbuf.
> 
> The Rx vector function can now be used with hw_ip_checksum
> enabled.
> 
> Tested with:
> 
>   cd dpdk.org/
>   make config T=x86_64-native-linuxapp-gcc
>   make -j32
>   mkdir -p /mnt/huge
>   mount -t hugetlbfs nodev /mnt/huge
>   echo 256 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
>   modprobe uio_pci_generic
>   python tools/dpdk_nic_bind.py -b uio_pci_generic 0000:04:00.0
>   ./build/app/testpmd -l 2,4 -- --total-num-mbufs=65536 -i --port-topology=chained --enable-rx-cksum --disable-hw-vlan-filter --disable-hw-vlan-strip
>     set fwd rxonly
>     set verbose 1
>     start
> 
>   # send packets to testpmd using scapy
>   eh = Ether(src="00:01:02:03:04:05", dst="00:1B:21:AB:8F:10")
>   p = Ether()/IP(src="1.1.1.1", dst="1.1.1.2")/UDP()/Raw("x"*50)
>   sendp(p, iface="ixgbe2")
>   p = Ether()/IP(src="1.1.1.1", dst="1.1.1.2", chksum=42)/UDP()/Raw("x"*50)
>   sendp(p, iface="ixgbe2")
>   p = Ether()/IP(src="1.1.1.1", dst="1.1.1.2")/UDP(chksum=42)/Raw("x"*50)
>   sendp(p, iface="ixgbe2")
>   p = Ether()/IP(src="1.1.1.1", dst="1.1.1.2", chksum=45)/UDP(chksum=42)/Raw("x"*50)
>   sendp(p, iface="ixgbe2")
> 
>   # result
>   port 0/queue 0: received 1 packets
>     src=00:01:02:03:04:05 - dst=00:1B:21:AB:8F:10 - type=0x0800 - length=92 - nb_segs=1Unknown packet type
>    - Receive queue=0x0
>   port 0/queue 0: received 1 packets
>     src=00:01:02:03:04:05 - dst=00:1B:21:AB:8F:10 - type=0x0800 - length=92 - nb_segs=1Unknown packet type
>    - Receive queue=0x0
>     PKT_RX_IP_CKSUM_BAD
>   port 0/queue 0: received 1 packets
>     src=00:01:02:03:04:05 - dst=00:1B:21:AB:8F:10 - type=0x0800 - length=92 - nb_segs=1Unknown packet type
>    - Receive queue=0x0
>     PKT_RX_L4_CKSUM_BAD
>   port 0/queue 0: received 1 packets
>     src=00:01:02:03:04:05 - dst=00:1B:21:AB:8F:10 - type=0x0800 - length=92 - nb_segs=1Unknown packet type
>    - Receive queue=0x0
>     PKT_RX_L4_CKSUM_BAD
>     PKT_RX_IP_CKSUM_BAD
> 
> Signed-off-by: Maxime Leroy <maxime.leroy@6wind.com>
> Signed-off-by: Olivier Matz <olivier.matz@6wind.com>
> ---

Given this looks a significant change to a complicated piece of code, which is
also very performance sensitive, I believe this change needs to be deferred to
16.11 release, as there is not enough time to properly review and test it for
16.07.

/Bruce

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [dpdk-dev] [PATCH] ixgbe: support checksum flags in sse vector Rx function
  2016-07-08 20:42 ` Bruce Richardson
@ 2016-07-10 17:41   ` Olivier Matz
  0 siblings, 0 replies; 8+ messages in thread
From: Olivier Matz @ 2016-07-10 17:41 UTC (permalink / raw)
  To: Bruce Richardson; +Cc: dev, konstantin.ananyev, helin.zhang, Maxime Leroy

Hi Bruce,

On 07/08/2016 10:42 PM, Bruce Richardson wrote:
> On Thu, Jul 07, 2016 at 02:19:02PM +0200, Olivier Matz wrote:
>> Update desc_to_olflags_v() to set PKT_RX_IP_CKSUM_BAD and
>> PKT_RX_L4_CKSUM_BAD in the ol_fags of the mbuf.
>>
{...}
> 
> Given this looks a significant change to a complicated piece of code, which is
> also very performance sensitive, I believe this change needs to be deferred to
> 16.11 release, as there is not enough time to properly review and test it for
> 16.07.


Sure, that was the plan, I forgot to mention it :)

Thanks,
Olivier

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [dpdk-dev] [PATCH] ixgbe: support checksum flags in sse vector Rx function
  2016-07-07 12:19 [dpdk-dev] [PATCH] ixgbe: support checksum flags in sse vector Rx function Olivier Matz
  2016-07-08 20:42 ` Bruce Richardson
@ 2016-07-14  9:24 ` Chandran, Sugesh
  2016-07-19 15:51   ` Olivier Matz
  2016-09-14 12:39 ` Ferruh Yigit
  2016-10-06 14:00 ` [dpdk-dev] " Remy Horton
  3 siblings, 1 reply; 8+ messages in thread
From: Chandran, Sugesh @ 2016-07-14  9:24 UTC (permalink / raw)
  To: 'Olivier Matz', dev, Ananyev, Konstantin, Zhang, Helin
  Cc: Richardson, Bruce, Maxime Leroy

Hi Olivier,
Thank you for working on this.
We tried to enable checksum offload in OVS-DPDK and couldn't proceed due to the performance impact.
I assume this patch will fix that issue by enabling checksum offloading with vectorization ON at Rx side.

Few questions,
1) Is there any plan to extend this to other NIC drivers, other than ixgbe? What are the implications of it?
2) Is it possible to enable it on the Tx side as well?

I haven't looked into patch very detail and very little context on it. So please forgive me if any of these queries make no sense.

Regards
_Sugesh


> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Olivier Matz
> Sent: Thursday, July 7, 2016 1:19 PM
> To: dev@dpdk.org; Ananyev, Konstantin <konstantin.ananyev@intel.com>;
> Zhang, Helin <helin.zhang@intel.com>
> Cc: Richardson, Bruce <bruce.richardson@intel.com>; Maxime Leroy
> <maxime.leroy@6wind.com>
> Subject: [dpdk-dev] [PATCH] ixgbe: support checksum flags in sse vector Rx
> function
> 
> Update desc_to_olflags_v() to set PKT_RX_IP_CKSUM_BAD and
> PKT_RX_L4_CKSUM_BAD in the ol_fags of the mbuf.
> 
> The Rx vector function can now be used with hw_ip_checksum enabled.
> 
> Tested with:
> 
>   cd dpdk.org/
>   make config T=x86_64-native-linuxapp-gcc
>   make -j32
>   mkdir -p /mnt/huge
>   mount -t hugetlbfs nodev /mnt/huge
>   echo 256 > /sys/devices/system/node/node0/hugepages/hugepages-
> 2048kB/nr_hugepages
>   modprobe uio_pci_generic
>   python tools/dpdk_nic_bind.py -b uio_pci_generic 0000:04:00.0
>   ./build/app/testpmd -l 2,4 -- --total-num-mbufs=65536 -i --port-
> topology=chained --enable-rx-cksum --disable-hw-vlan-filter --disable-hw-
> vlan-strip
>     set fwd rxonly
>     set verbose 1
>     start
> 
>   # send packets to testpmd using scapy
>   eh = Ether(src="00:01:02:03:04:05", dst="00:1B:21:AB:8F:10")
>   p = Ether()/IP(src="1.1.1.1", dst="1.1.1.2")/UDP()/Raw("x"*50)
>   sendp(p, iface="ixgbe2")
>   p = Ether()/IP(src="1.1.1.1", dst="1.1.1.2", chksum=42)/UDP()/Raw("x"*50)
>   sendp(p, iface="ixgbe2")
>   p = Ether()/IP(src="1.1.1.1", dst="1.1.1.2")/UDP(chksum=42)/Raw("x"*50)
>   sendp(p, iface="ixgbe2")
>   p = Ether()/IP(src="1.1.1.1", dst="1.1.1.2",
> chksum=45)/UDP(chksum=42)/Raw("x"*50)
>   sendp(p, iface="ixgbe2")
> 
>   # result
>   port 0/queue 0: received 1 packets
>     src=00:01:02:03:04:05 - dst=00:1B:21:AB:8F:10 - type=0x0800 - length=92 -
> nb_segs=1Unknown packet type
>    - Receive queue=0x0
>   port 0/queue 0: received 1 packets
>     src=00:01:02:03:04:05 - dst=00:1B:21:AB:8F:10 - type=0x0800 - length=92 -
> nb_segs=1Unknown packet type
>    - Receive queue=0x0
>     PKT_RX_IP_CKSUM_BAD
>   port 0/queue 0: received 1 packets
>     src=00:01:02:03:04:05 - dst=00:1B:21:AB:8F:10 - type=0x0800 - length=92 -
> nb_segs=1Unknown packet type
>    - Receive queue=0x0
>     PKT_RX_L4_CKSUM_BAD
>   port 0/queue 0: received 1 packets
>     src=00:01:02:03:04:05 - dst=00:1B:21:AB:8F:10 - type=0x0800 - length=92 -
> nb_segs=1Unknown packet type
>    - Receive queue=0x0
>     PKT_RX_L4_CKSUM_BAD
>     PKT_RX_IP_CKSUM_BAD
> 
> Signed-off-by: Maxime Leroy <maxime.leroy@6wind.com>
> Signed-off-by: Olivier Matz <olivier.matz@6wind.com>
> ---
>  drivers/net/ixgbe/ixgbe_rxtx_vec_common.h |  8 ++---
>  drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c   |  6 ++++
>  drivers/net/ixgbe/ixgbe_rxtx_vec_sse.c    | 50 +++++++++++++++++++++--
> --------
>  3 files changed, 42 insertions(+), 22 deletions(-)
> 
> diff --git a/drivers/net/ixgbe/ixgbe_rxtx_vec_common.h
> b/drivers/net/ixgbe/ixgbe_rxtx_vec_common.h
> index 62b8201..05f8185 100644
> --- a/drivers/net/ixgbe/ixgbe_rxtx_vec_common.h
> +++ b/drivers/net/ixgbe/ixgbe_rxtx_vec_common.h
> @@ -309,12 +309,8 @@
> ixgbe_rx_vec_dev_conf_condition_check_default(struct rte_eth_dev *dev)
>  	if (fconf->mode != RTE_FDIR_MODE_NONE)
>  		return -1;
> 
> -	/*
> -	 * - no csum error report support
> -	 * - no header split support
> -	 */
> -	if (rxmode->hw_ip_checksum == 1 ||
> -	    rxmode->header_split == 1)
> +	/* no header split support */
> +	if (rxmode->header_split == 1)
>  		return -1;
> 
>  	return 0;
> diff --git a/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
> b/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
> index 64a329e..f96cc85 100644
> --- a/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
> +++ b/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
> @@ -556,5 +556,11 @@ ixgbe_txq_vec_setup(struct ixgbe_tx_queue *txq)
> int __attribute__((cold))  ixgbe_rx_vec_dev_conf_condition_check(struct
> rte_eth_dev *dev)  {
> +	struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode;
> +
> +	/* no csum error report support */
> +	if (rxmode->hw_ip_checksum == 1)
> +		return -1;
> +
>  	return ixgbe_rx_vec_dev_conf_condition_check_default(dev);
>  }
> diff --git a/drivers/net/ixgbe/ixgbe_rxtx_vec_sse.c
> b/drivers/net/ixgbe/ixgbe_rxtx_vec_sse.c
> index 1c4fd7c..dc5657e 100644
> --- a/drivers/net/ixgbe/ixgbe_rxtx_vec_sse.c
> +++ b/drivers/net/ixgbe/ixgbe_rxtx_vec_sse.c
> @@ -145,7 +145,7 @@ static inline void
>  desc_to_olflags_v(__m128i descs[4], uint8_t vlan_flags,
>  	struct rte_mbuf **rx_pkts)
>  {
> -	__m128i ptype0, ptype1, vtag0, vtag1;
> +	__m128i ptype0, ptype1, vtag0, vtag1, csum;
>  	union {
>  		uint16_t e[4];
>  		uint64_t dword;
> @@ -162,18 +162,26 @@ desc_to_olflags_v(__m128i descs[4], uint8_t
> vlan_flags,
>  			PKT_RX_RSS_HASH, 0, PKT_RX_RSS_HASH, 0,
>  			PKT_RX_RSS_HASH, PKT_RX_RSS_HASH,
> PKT_RX_RSS_HASH, 0);
> 
> -	/* mask everything except vlan present bit */
> -	const __m128i vlan_msk = _mm_set_epi16(
> -			0x0000, 0x0000,
> -			0x0000, 0x0000,
> -			IXGBE_RXD_STAT_VP, IXGBE_RXD_STAT_VP,
> -			IXGBE_RXD_STAT_VP, IXGBE_RXD_STAT_VP);
> -	/* map vlan present (0x8) to ol_flags */
> -	const __m128i vlan_map = _mm_set_epi8(
> +	/* mask everything except vlan present and l4/ip csum error */
> +	const __m128i vlan_csum_msk = _mm_set_epi16(
> +		(IXGBE_RXDADV_ERR_TCPE | IXGBE_RXDADV_ERR_IPE) >>
> 16,
> +		(IXGBE_RXDADV_ERR_TCPE | IXGBE_RXDADV_ERR_IPE) >>
> 16,
> +		(IXGBE_RXDADV_ERR_TCPE | IXGBE_RXDADV_ERR_IPE) >>
> 16,
> +		(IXGBE_RXDADV_ERR_TCPE | IXGBE_RXDADV_ERR_IPE) >>
> 16,
> +		IXGBE_RXD_STAT_VP, IXGBE_RXD_STAT_VP,
> +		IXGBE_RXD_STAT_VP, IXGBE_RXD_STAT_VP);
> +	/* map vlan present (0x8), IPE (0x2), L4E (0x1) to ol_flags */
> +	const __m128i vlan_csum_map = _mm_set_epi8(
>  		0, 0, 0, 0,
> -		0, 0, 0, vlan_flags,
> +		vlan_flags | PKT_RX_IP_CKSUM_BAD |
> PKT_RX_L4_CKSUM_BAD,
> +		vlan_flags | PKT_RX_IP_CKSUM_BAD,
> +		vlan_flags | PKT_RX_L4_CKSUM_BAD,
> +		vlan_flags,
>  		0, 0, 0, 0,
> -		0, 0, 0, 0);
> +		PKT_RX_IP_CKSUM_BAD | PKT_RX_L4_CKSUM_BAD,
> +		PKT_RX_IP_CKSUM_BAD,
> +		PKT_RX_L4_CKSUM_BAD,
> +		0);
> 
>  	ptype0 = _mm_unpacklo_epi16(descs[0], descs[1]);
>  	ptype1 = _mm_unpacklo_epi16(descs[2], descs[3]); @@ -185,8
> +193,21 @@ desc_to_olflags_v(__m128i descs[4], uint8_t vlan_flags,
>  	ptype0 = _mm_shuffle_epi8(rss_flags, ptype0);
> 
>  	vtag1 = _mm_unpacklo_epi32(vtag0, vtag1);
> -	vtag1 = _mm_and_si128(vtag1, vlan_msk);
> -	vtag1 = _mm_shuffle_epi8(vlan_map, vtag1);
> +	vtag1 = _mm_and_si128(vtag1, vlan_csum_msk);
> +
> +	/* csum bits are in the most significant, to use shuffle we need to
> +	 * shift them. Change mask to 0xc000 to 0x0003.
> +	 */
> +	csum = _mm_srli_epi16(vtag1, 14);
> +
> +	/* now or the most significant 64 bits containing the checksum
> +	 * flags with the vlan present flags.
> +	 */
> +	csum = _mm_srli_si128(csum, 8);
> +	vtag1 = _mm_or_si128(csum, vtag1);
> +
> +	/* convert VP, IPE, L4E to ol_flags */
> +	vtag1 = _mm_shuffle_epi8(vlan_csum_map, vtag1);
> 
>  	vtag1 = _mm_or_si128(ptype0, vtag1);
>  	vol.dword = _mm_cvtsi128_si64(vtag1);
> @@ -210,7 +231,6 @@ desc_to_olflags_v(__m128i descs[4], uint8_t
> vlan_flags,
>   * - nb_pkts > RTE_IXGBE_MAX_RX_BURST, only scan
> RTE_IXGBE_MAX_RX_BURST
>   *   numbers of DD bit
>   * - floor align nb_pkts to a RTE_IXGBE_DESC_PER_LOOP power-of-two
> - * - don't support ol_flags for rss and csum err
>   */
>  static inline uint16_t
>  _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf
> **rx_pkts, @@ -425,7 +445,6 @@ _recv_raw_pkts_vec(struct
> ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
>   * - nb_pkts > RTE_IXGBE_MAX_RX_BURST, only scan
> RTE_IXGBE_MAX_RX_BURST
>   *   numbers of DD bit
>   * - floor align nb_pkts to a RTE_IXGBE_DESC_PER_LOOP power-of-two
> - * - don't support ol_flags for rss and csum err
>   */
>  uint16_t
>  ixgbe_recv_pkts_vec(void *rx_queue, struct rte_mbuf **rx_pkts, @@ -
> 438,7 +457,6 @@ ixgbe_recv_pkts_vec(void *rx_queue, struct rte_mbuf
> **rx_pkts,
>   * vPMD receive routine that reassembles scattered packets
>   *
>   * Notice:
> - * - don't support ol_flags for rss and csum err
>   * - nb_pkts < RTE_IXGBE_DESCS_PER_LOOP, just return no packet
>   * - nb_pkts > RTE_IXGBE_MAX_RX_BURST, only scan
> RTE_IXGBE_MAX_RX_BURST
>   *   numbers of DD bit
> --
> 2.8.1

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [dpdk-dev] [PATCH] ixgbe: support checksum flags in sse vector Rx function
  2016-07-14  9:24 ` Chandran, Sugesh
@ 2016-07-19 15:51   ` Olivier Matz
  0 siblings, 0 replies; 8+ messages in thread
From: Olivier Matz @ 2016-07-19 15:51 UTC (permalink / raw)
  To: Chandran, Sugesh, dev, Ananyev, Konstantin, Zhang, Helin
  Cc: Richardson, Bruce, Maxime Leroy

Hi Sugesh,

On 07/14/2016 11:24 AM, Chandran, Sugesh wrote:
> Hi Olivier,
> Thank you for working on this.
> We tried to enable checksum offload in OVS-DPDK and couldn't proceed due to the performance impact.
> I assume this patch will fix that issue by enabling checksum offloading with vectorization ON at Rx side.
> 
> Few questions,
> 1) Is there any plan to extend this to other NIC drivers, other than ixgbe? What are the implications of it?

On my side no plan for other drivers, but this is more a question for
pmd maintainers.


> 2) Is it possible to enable it on the Tx side as well?

Yes, vector tx is enabled or not depending on the feature you request at
init (offload, multisegments, ...). See ixgbe_set_tx_function() for
details. My patch does not change this behavior.

> 
> I haven't looked into patch very detail and very little context on it. So please forgive me if any of these queries make no sense.
> 
> Regards
> _Sugesh

Regards,
Olivier

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [dpdk-dev] [PATCH] ixgbe: support checksum flags in sse vector Rx function
  2016-07-07 12:19 [dpdk-dev] [PATCH] ixgbe: support checksum flags in sse vector Rx function Olivier Matz
  2016-07-08 20:42 ` Bruce Richardson
  2016-07-14  9:24 ` Chandran, Sugesh
@ 2016-09-14 12:39 ` Ferruh Yigit
  2016-10-06 14:00 ` [dpdk-dev] " Remy Horton
  3 siblings, 0 replies; 8+ messages in thread
From: Ferruh Yigit @ 2016-09-14 12:39 UTC (permalink / raw)
  To: Olivier Matz, dev, Ananyev, Konstantin, Zhang, Helin
  Cc: Richardson, Bruce, Maxime Leroy

On 7/7/2016 1:19 PM, Olivier Matz wrote:
> Update desc_to_olflags_v() to set PKT_RX_IP_CKSUM_BAD and
> PKT_RX_L4_CKSUM_BAD in the ol_fags of the mbuf.
> 
> The Rx vector function can now be used with hw_ip_checksum
> enabled.
> 
> Tested with:
> 
>   cd dpdk.org/
>   make config T=x86_64-native-linuxapp-gcc
>   make -j32
>   mkdir -p /mnt/huge
>   mount -t hugetlbfs nodev /mnt/huge
>   echo 256 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
>   modprobe uio_pci_generic
>   python tools/dpdk_nic_bind.py -b uio_pci_generic 0000:04:00.0
>   ./build/app/testpmd -l 2,4 -- --total-num-mbufs=65536 -i --port-topology=chained --enable-rx-cksum --disable-hw-vlan-filter --disable-hw-vlan-strip
>     set fwd rxonly
>     set verbose 1
>     start
> 
>   # send packets to testpmd using scapy
>   eh = Ether(src="00:01:02:03:04:05", dst="00:1B:21:AB:8F:10")
>   p = Ether()/IP(src="1.1.1.1", dst="1.1.1.2")/UDP()/Raw("x"*50)
>   sendp(p, iface="ixgbe2")
>   p = Ether()/IP(src="1.1.1.1", dst="1.1.1.2", chksum=42)/UDP()/Raw("x"*50)
>   sendp(p, iface="ixgbe2")
>   p = Ether()/IP(src="1.1.1.1", dst="1.1.1.2")/UDP(chksum=42)/Raw("x"*50)
>   sendp(p, iface="ixgbe2")
>   p = Ether()/IP(src="1.1.1.1", dst="1.1.1.2", chksum=45)/UDP(chksum=42)/Raw("x"*50)
>   sendp(p, iface="ixgbe2")
> 
>   # result
>   port 0/queue 0: received 1 packets
>     src=00:01:02:03:04:05 - dst=00:1B:21:AB:8F:10 - type=0x0800 - length=92 - nb_segs=1Unknown packet type
>    - Receive queue=0x0
>   port 0/queue 0: received 1 packets
>     src=00:01:02:03:04:05 - dst=00:1B:21:AB:8F:10 - type=0x0800 - length=92 - nb_segs=1Unknown packet type
>    - Receive queue=0x0
>     PKT_RX_IP_CKSUM_BAD
>   port 0/queue 0: received 1 packets
>     src=00:01:02:03:04:05 - dst=00:1B:21:AB:8F:10 - type=0x0800 - length=92 - nb_segs=1Unknown packet type
>    - Receive queue=0x0
>     PKT_RX_L4_CKSUM_BAD
>   port 0/queue 0: received 1 packets
>     src=00:01:02:03:04:05 - dst=00:1B:21:AB:8F:10 - type=0x0800 - length=92 - nb_segs=1Unknown packet type
>    - Receive queue=0x0
>     PKT_RX_L4_CKSUM_BAD
>     PKT_RX_IP_CKSUM_BAD
> 
> Signed-off-by: Maxime Leroy <maxime.leroy@6wind.com>
> Signed-off-by: Olivier Matz <olivier.matz@6wind.com>
> ---

ixgbe maintainers, can you please review the patch?

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [dpdk-dev] ixgbe: support checksum flags in sse vector Rx function
  2016-07-07 12:19 [dpdk-dev] [PATCH] ixgbe: support checksum flags in sse vector Rx function Olivier Matz
                   ` (2 preceding siblings ...)
  2016-09-14 12:39 ` Ferruh Yigit
@ 2016-10-06 14:00 ` Remy Horton
  2016-10-13 23:27   ` Thomas Monjalon
  3 siblings, 1 reply; 8+ messages in thread
From: Remy Horton @ 2016-10-06 14:00 UTC (permalink / raw)
  To: Olivier Matz, dev, konstantin.ananyev, helin.zhang
  Cc: bruce.richardson, Maxime Leroy


On 07/07/2016 13:19, Olivier Matz wrote:
[..]
> Signed-off-by: Maxime Leroy <maxime.leroy@6wind.com>
> Signed-off-by: Olivier Matz <olivier.matz@6wind.com>
> ---
>  drivers/net/ixgbe/ixgbe_rxtx_vec_common.h |  8 ++---
>  drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c   |  6 ++++
>  drivers/net/ixgbe/ixgbe_rxtx_vec_sse.c    | 50 +++++++++++++++++++++----------
>  3 files changed, 42 insertions(+), 22 deletions(-)

Acked-by: Remy Horton <remy.horton@intel.com>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [dpdk-dev] ixgbe: support checksum flags in sse vector Rx function
  2016-10-06 14:00 ` [dpdk-dev] " Remy Horton
@ 2016-10-13 23:27   ` Thomas Monjalon
  0 siblings, 0 replies; 8+ messages in thread
From: Thomas Monjalon @ 2016-10-13 23:27 UTC (permalink / raw)
  To: Olivier Matz
  Cc: dev, Remy Horton, konstantin.ananyev, helin.zhang,
	bruce.richardson, Maxime Leroy

2016-10-06 15:00, Remy Horton:
> On 07/07/2016 13:19, Olivier Matz wrote:
> [..]
> > Signed-off-by: Maxime Leroy <maxime.leroy@6wind.com>
> > Signed-off-by: Olivier Matz <olivier.matz@6wind.com>
> > ---
> >  drivers/net/ixgbe/ixgbe_rxtx_vec_common.h |  8 ++---
> >  drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c   |  6 ++++
> >  drivers/net/ixgbe/ixgbe_rxtx_vec_sse.c    | 50 +++++++++++++++++++++----------
> >  3 files changed, 42 insertions(+), 22 deletions(-)
> 
> Acked-by: Remy Horton <remy.horton@intel.com>

Applied directly in mainline on Ferruh's advice

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2016-10-13 23:27 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-07-07 12:19 [dpdk-dev] [PATCH] ixgbe: support checksum flags in sse vector Rx function Olivier Matz
2016-07-08 20:42 ` Bruce Richardson
2016-07-10 17:41   ` Olivier Matz
2016-07-14  9:24 ` Chandran, Sugesh
2016-07-19 15:51   ` Olivier Matz
2016-09-14 12:39 ` Ferruh Yigit
2016-10-06 14:00 ` [dpdk-dev] " Remy Horton
2016-10-13 23:27   ` Thomas Monjalon

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).