From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by dpdk.org (Postfix) with ESMTP id 21D0D3989 for ; Thu, 14 Jul 2016 11:24:11 +0200 (CEST) Received: from orsmga003.jf.intel.com ([10.7.209.27]) by orsmga103.jf.intel.com with ESMTP; 14 Jul 2016 02:24:10 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.28,361,1464678000"; d="scan'208";a="846071741" Received: from irsmsx110.ger.corp.intel.com ([163.33.3.25]) by orsmga003.jf.intel.com with ESMTP; 14 Jul 2016 02:24:09 -0700 Received: from irsmsx102.ger.corp.intel.com ([169.254.2.10]) by irsmsx110.ger.corp.intel.com ([163.33.3.25]) with mapi id 14.03.0248.002; Thu, 14 Jul 2016 10:24:07 +0100 From: "Chandran, Sugesh" To: 'Olivier Matz' , "dev@dpdk.org" , "Ananyev, Konstantin" , "Zhang, Helin" CC: "Richardson, Bruce" , Maxime Leroy Thread-Topic: [dpdk-dev] [PATCH] ixgbe: support checksum flags in sse vector Rx function Thread-Index: AQHR2EoRjquCNLNiDkKJ5KJwgq6jWqAXqp0g Date: Thu, 14 Jul 2016 09:24:07 +0000 Message-ID: <2EF2F5C0CC56984AA024D0B180335FCB13DEDCB2@IRSMSX102.ger.corp.intel.com> References: <1467893942-4048-1-git-send-email-olivier.matz@6wind.com> In-Reply-To: <1467893942-4048-1-git-send-email-olivier.matz@6wind.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [163.33.239.180] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Subject: Re: [dpdk-dev] [PATCH] ixgbe: support checksum flags in sse vector Rx function X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 14 Jul 2016 09:24:11 -0000 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 wit= h 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 p= lease 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 ; > Zhang, Helin > Cc: Richardson, Bruce ; Maxime Leroy > > Subject: [dpdk-dev] [PATCH] ixgbe: support checksum flags in sse vector R= x > function >=20 > 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. >=20 > The Rx vector function can now be used with hw_ip_checksum enabled. >=20 > Tested with: >=20 > cd dpdk.org/ > make config T=3Dx86_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=3D65536 -i --port- > topology=3Dchained --enable-rx-cksum --disable-hw-vlan-filter --disable-h= w- > vlan-strip > set fwd rxonly > set verbose 1 > start >=20 > # send packets to testpmd using scapy > eh =3D Ether(src=3D"00:01:02:03:04:05", dst=3D"00:1B:21:AB:8F:10") > p =3D Ether()/IP(src=3D"1.1.1.1", dst=3D"1.1.1.2")/UDP()/Raw("x"*50) > sendp(p, iface=3D"ixgbe2") > p =3D Ether()/IP(src=3D"1.1.1.1", dst=3D"1.1.1.2", chksum=3D42)/UDP()/R= aw("x"*50) > sendp(p, iface=3D"ixgbe2") > p =3D Ether()/IP(src=3D"1.1.1.1", dst=3D"1.1.1.2")/UDP(chksum=3D42)/Raw= ("x"*50) > sendp(p, iface=3D"ixgbe2") > p =3D Ether()/IP(src=3D"1.1.1.1", dst=3D"1.1.1.2", > chksum=3D45)/UDP(chksum=3D42)/Raw("x"*50) > sendp(p, iface=3D"ixgbe2") >=20 > # result > port 0/queue 0: received 1 packets > src=3D00:01:02:03:04:05 - dst=3D00:1B:21:AB:8F:10 - type=3D0x0800 - l= ength=3D92 - > nb_segs=3D1Unknown packet type > - Receive queue=3D0x0 > port 0/queue 0: received 1 packets > src=3D00:01:02:03:04:05 - dst=3D00:1B:21:AB:8F:10 - type=3D0x0800 - l= ength=3D92 - > nb_segs=3D1Unknown packet type > - Receive queue=3D0x0 > PKT_RX_IP_CKSUM_BAD > port 0/queue 0: received 1 packets > src=3D00:01:02:03:04:05 - dst=3D00:1B:21:AB:8F:10 - type=3D0x0800 - l= ength=3D92 - > nb_segs=3D1Unknown packet type > - Receive queue=3D0x0 > PKT_RX_L4_CKSUM_BAD > port 0/queue 0: received 1 packets > src=3D00:01:02:03:04:05 - dst=3D00:1B:21:AB:8F:10 - type=3D0x0800 - l= ength=3D92 - > nb_segs=3D1Unknown packet type > - Receive queue=3D0x0 > PKT_RX_L4_CKSUM_BAD > PKT_RX_IP_CKSUM_BAD >=20 > 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(-) >=20 > 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 !=3D RTE_FDIR_MODE_NONE) > return -1; >=20 > - /* > - * - no csum error report support > - * - no header split support > - */ > - if (rxmode->hw_ip_checksum =3D=3D 1 || > - rxmode->header_split =3D=3D 1) > + /* no header split support */ > + if (rxmode->header_split =3D=3D 1) > return -1; >=20 > 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 =3D &dev->data->dev_conf.rxmode; > + > + /* no csum error report support */ > + if (rxmode->hw_ip_checksum =3D=3D 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); >=20 > - /* mask everything except vlan present bit */ > - const __m128i vlan_msk =3D _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 =3D _mm_set_epi8( > + /* mask everything except vlan present and l4/ip csum error */ > + const __m128i vlan_csum_msk =3D _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 =3D _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); >=20 > ptype0 =3D _mm_unpacklo_epi16(descs[0], descs[1]); > ptype1 =3D _mm_unpacklo_epi16(descs[2], descs[3]); @@ -185,8 > +193,21 @@ desc_to_olflags_v(__m128i descs[4], uint8_t vlan_flags, > ptype0 =3D _mm_shuffle_epi8(rss_flags, ptype0); >=20 > vtag1 =3D _mm_unpacklo_epi32(vtag0, vtag1); > - vtag1 =3D _mm_and_si128(vtag1, vlan_msk); > - vtag1 =3D _mm_shuffle_epi8(vlan_map, vtag1); > + vtag1 =3D _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 =3D _mm_srli_epi16(vtag1, 14); > + > + /* now or the most significant 64 bits containing the checksum > + * flags with the vlan present flags. > + */ > + csum =3D _mm_srli_si128(csum, 8); > + vtag1 =3D _mm_or_si128(csum, vtag1); > + > + /* convert VP, IPE, L4E to ol_flags */ > + vtag1 =3D _mm_shuffle_epi8(vlan_csum_map, vtag1); >=20 > vtag1 =3D _mm_or_si128(ptype0, vtag1); > vol.dword =3D _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