From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by dpdk.org (Postfix) with ESMTP id 3FBAD2E83 for ; Wed, 11 Nov 2015 07:48:34 +0100 (CET) Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga103.fm.intel.com with ESMTP; 10 Nov 2015 22:48:34 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.20,274,1444719600"; d="scan'208";a="682758618" Received: from fmsmsx104.amr.corp.intel.com ([10.18.124.202]) by orsmga003.jf.intel.com with ESMTP; 10 Nov 2015 22:48:33 -0800 Received: from shsmsx104.ccr.corp.intel.com (10.239.4.70) by fmsmsx104.amr.corp.intel.com (10.18.124.202) with Microsoft SMTP Server (TLS) id 14.3.248.2; Tue, 10 Nov 2015 22:48:27 -0800 Received: from shsmsx101.ccr.corp.intel.com ([169.254.1.83]) by SHSMSX104.ccr.corp.intel.com ([169.254.5.223]) with mapi id 14.03.0248.002; Wed, 11 Nov 2015 14:47:59 +0800 From: "Liu, Jijiang" To: Yuanhan Liu Thread-Topic: [dpdk-dev] [PATCH v3 8/8] examples/vhost:support TX offload in vhost sample Thread-Index: AQHRFu9B3tJD2iqHg0yxH2kp7cPTv56SlwKAgAPTprA= Date: Wed, 11 Nov 2015 06:47:59 +0000 Message-ID: <1ED644BD7E0A5F4091CF203DAFB8E4CC22BDA2B7@SHSMSX101.ccr.corp.intel.com> References: <1446634456-413-1-git-send-email-jijiang.liu@intel.com> <1446634456-413-9-git-send-email-jijiang.liu@intel.com> <20151109041707.GJ2326@yliu-dev.sh.intel.com> In-Reply-To: <20151109041707.GJ2326@yliu-dev.sh.intel.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.239.127.40] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Cc: "dev@dpdk.org" Subject: Re: [dpdk-dev] [PATCH v3 8/8] examples/vhost:support TX offload in vhost sample 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: Wed, 11 Nov 2015 06:48:35 -0000 > -----Original Message----- > From: Yuanhan Liu [mailto:yuanhan.liu@linux.intel.com] > Sent: Monday, November 09, 2015 12:17 PM > To: Liu, Jijiang > Cc: dev@dpdk.org > Subject: Re: [dpdk-dev] [PATCH v3 8/8] examples/vhost:support TX offload = in > vhost sample >=20 > On Wed, Nov 04, 2015 at 06:54:16PM +0800, Jijiang Liu wrote: > > Change the vhost sample to support and test TX offload. > > > > Signed-off-by: Jijiang Liu > > --- > > examples/vhost/main.c | 128 > > ++++++++++++++++++++++++++++++++++++++++++------- > > 1 files changed, 111 insertions(+), 17 deletions(-) > > > > diff --git a/examples/vhost/main.c b/examples/vhost/main.c index > > 9eac2d0..06e1e8b 100644 > > --- a/examples/vhost/main.c > > +++ b/examples/vhost/main.c > > @@ -50,6 +50,10 @@ > > #include > > #include > > #include > > +#include > > +#include > > +#include > > +#include > > > > #include "main.h" > > > > @@ -140,6 +144,8 @@ > > > > #define MBUF_EXT_MEM(mb) (rte_mbuf_from_indirect(mb) !=3D (mb)) > > > > +#define VIRTIO_TX_CKSUM_OFFLOAD_MASK (PKT_TX_IP_CKSUM | > > +PKT_TX_L4_MASK) > > + > > /* mask of enabled ports */ > > static uint32_t enabled_port_mask =3D 0; > > > > @@ -197,6 +203,13 @@ typedef enum { > > static uint32_t enable_stats =3D 0; > > /* Enable retries on RX. */ > > static uint32_t enable_retry =3D 1; > > + > > +/* Disable TX checksum offload */ > ^^^^^^^ > You meant to "Enable"? >=20 > > +static uint32_t enable_tx_csum; > > + > > +/* Disable TSO offload */ > > +static uint32_t enable_tso; >=20 > Actually, I'd like to see TSO/CSUM offloading is enabled by default: > they are so common, and they are enabled in a lot places by default, say, > kernel, qemu. There is no reason to make it "disable" here. >=20 > > + > > /* Specify timeout (in useconds) between retries on RX. */ static > > uint32_t burst_rx_delay_time =3D BURST_RX_WAIT_US; > > /* Specify the number of retries on RX. */ @@ -292,20 +305,6 @@ > > struct vlan_ethhdr { > > __be16 h_vlan_encapsulated_proto; > > }; > > > > -/* IPv4 Header */ > > -struct ipv4_hdr { > > - uint8_t version_ihl; /**< version and header length */ > > - uint8_t type_of_service; /**< type of service */ > > - uint16_t total_length; /**< length of packet */ > > - uint16_t packet_id; /**< packet ID */ > > - uint16_t fragment_offset; /**< fragmentation offset */ > > - uint8_t time_to_live; /**< time to live */ > > - uint8_t next_proto_id; /**< protocol ID */ > > - uint16_t hdr_checksum; /**< header checksum */ > > - uint32_t src_addr; /**< source address */ > > - uint32_t dst_addr; /**< destination address */ > > -} __attribute__((__packed__)); >=20 >=20 > Minor nit: it's a cleanup, having nothing to do with this patch (to > demonstrate TSO/CSUM). It belongs to another patch. >=20 > > - > > /* Header lengths. */ > > #define VLAN_HLEN 4 > > #define VLAN_ETH_HLEN 18 > > @@ -441,6 +440,14 @@ port_init(uint8_t port) > > > > if (port >=3D rte_eth_dev_count()) return -1; > > > > + if (enable_tx_csum =3D=3D 0) > > + rte_vhost_feature_disable(1ULL << VIRTIO_NET_F_CSUM); > > + > > + if (enable_tso =3D=3D 0) { > > + rte_vhost_feature_disable(1ULL << > VIRTIO_NET_F_HOST_TSO4); > > + rte_vhost_feature_disable(1ULL << > VIRTIO_NET_F_HOST_TSO6); > > + } > > + > > rx_rings =3D (uint16_t)dev_info.max_rx_queues; > > /* Configure ethernet device. */ > > retval =3D rte_eth_dev_configure(port, rx_rings, tx_rings, > > &port_conf); @@ -576,7 +583,9 @@ us_vhost_usage(const char > *prgname) > > " --rx-desc-num [0-N]: the number of descriptors on rx, > " > > "used only when zero copy is enabled.\n" > > " --tx-desc-num [0-N]: the number of descriptors on tx, > " > > - "used only when zero copy is enabled.\n", > > + "used only when zero copy is enabled.\n" > > + " --tx-csum [0|1] disable/enable TX checksum > offload.\n" > > + " --tso [0|1] disable/enable TCP segement offload.\n", > > prgname); > > } > > > > @@ -602,6 +611,8 @@ us_vhost_parse_args(int argc, char **argv) > > {"zero-copy", required_argument, NULL, 0}, > > {"rx-desc-num", required_argument, NULL, 0}, > > {"tx-desc-num", required_argument, NULL, 0}, > > + {"tx-csum", required_argument, NULL, 0}, > > + {"tso", required_argument, NULL, 0}, > > {NULL, 0, 0, 0}, > > }; > > > > @@ -656,6 +667,28 @@ us_vhost_parse_args(int argc, char **argv) > > } > > } > > > > + /* Enable/disable TX checksum offload. */ > > + if (!strncmp(long_option[option_index].name, "tx- > csum", MAX_LONG_OPT_SZ)) { > > + ret =3D parse_num_opt(optarg, 1); > > + if (ret =3D=3D -1) { > > + RTE_LOG(INFO, VHOST_CONFIG, > "Invalid argument for tx-csum [0|1]\n"); > > + us_vhost_usage(prgname); > > + return -1; > > + } else > > + enable_tx_csum =3D ret; > > + } > > + > > + /* Enable/disable TSO offload. */ > > + if (!strncmp(long_option[option_index].name, "tso", > MAX_LONG_OPT_SZ)) { > > + ret =3D parse_num_opt(optarg, 1); > > + if (ret =3D=3D -1) { > > + RTE_LOG(INFO, VHOST_CONFIG, > "Invalid argument for tso [0|1]\n"); > > + us_vhost_usage(prgname); > > + return -1; > > + } else > > + enable_tso =3D ret; > > + } > > + > > /* Specify the retries delay time (in useconds) on RX. > */ > > if (!strncmp(long_option[option_index].name, "rx- > retry-delay", MAX_LONG_OPT_SZ)) { > > ret =3D parse_num_opt(optarg, INT32_MAX); > @@ -1114,6 +1147,63 @@ > > find_local_dest(struct virtio_net *dev, struct rte_mbuf *m, > > return 0; > > } > > > > +static uint16_t > > +get_psd_sum(void *l3_hdr, uint64_t ol_flags) { > > + if (ol_flags & PKT_TX_IPV4) > > + return rte_ipv4_phdr_cksum(l3_hdr, ol_flags); > > + else /* assume ethertype =3D=3D ETHER_TYPE_IPv6 */ > > + return rte_ipv6_phdr_cksum(l3_hdr, ol_flags); } > > + > > +static void virtio_tx_offload(struct rte_mbuf *m) { > > + void *l3_hdr; > > + struct ipv4_hdr *ipv4_hdr =3D NULL; > > + struct tcp_hdr *tcp_hdr =3D NULL; > > + struct udp_hdr *udp_hdr =3D NULL; > > + struct sctp_hdr *sctp_hdr =3D NULL; > > + struct ether_hdr *eth_hdr =3D rte_pktmbuf_mtod(m, struct ether_hdr > *); > > + > > + l3_hdr =3D (char *)eth_hdr + m->l2_len; > > + > > + if (m->ol_flags & PKT_TX_IPV4) { > > + ipv4_hdr =3D (struct ipv4_hdr *)l3_hdr; > > + if (m->ol_flags & PKT_TX_IP_CKSUM) > > + ipv4_hdr->hdr_checksum =3D 0; > > + } > > + > > + if (m->ol_flags & PKT_TX_L4_MASK) { > > + switch (m->ol_flags & PKT_TX_L4_MASK) { > > + case PKT_TX_TCP_CKSUM: > > + tcp_hdr =3D (struct tcp_hdr *) > > + ((char *)l3_hdr + m->l3_len); > > + tcp_hdr->cksum =3D get_psd_sum(l3_hdr, m->ol_flags); >=20 > I'm wondering that's necessary here (even for the data going through nic)= . > AFAIK, the kernel sending the data will calculate pseudo checksum. >=20 > (I may be wrong; a simple validation could prove that) > After testing with combining TSO, these fileds need to be set. > --yliu