[dpdk-dev] [PATCH] ixgbe: support checksum flags in sse vector Rx function

2016-09-14 Thread Ferruh Yigit
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 :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 
> Signed-off-by: Olivier Matz 
> ---

ixgbe maintainers, can you please review the patch?



[dpdk-dev] [PATCH] ixgbe: support checksum flags in sse vector Rx function

2016-07-19 Thread Olivier Matz
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



[dpdk-dev] [PATCH] ixgbe: support checksum flags in sse vector Rx function

2016-07-14 Thread Chandran, Sugesh
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 at dpdk.org] On Behalf Of Olivier Matz
> Sent: Thursday, July 7, 2016 1:19 PM
> To: dev at dpdk.org; Ananyev, Konstantin ;
> Zhang, Helin 
> Cc: Richardson, Bruce ; Maxime Leroy
> 
> 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 :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 
> Signed-off-by: Olivier Matz 
> ---
>  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

[dpdk-dev] [PATCH] ixgbe: support checksum flags in sse vector Rx function

2016-07-10 Thread Olivier Matz
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


[dpdk-dev] [PATCH] ixgbe: support checksum flags in sse vector Rx function

2016-07-08 Thread Bruce Richardson
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 :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 
> Signed-off-by: Olivier Matz 
> ---

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


[dpdk-dev] [PATCH] ixgbe: support checksum flags in sse vector Rx function

2016-07-07 Thread Olivier Matz
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 :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 
Signed-off-by: Olivier Matz 
---
 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(
-   0x, 0x,
-   0x, 0x,
-   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_