[dpdk-dev] [PATCH] ixgbe: support checksum flags in sse vector Rx function
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
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
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
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
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
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_