[dpdk-dev] [PATCH v3 8/8] examples/vhost:support TX offload in vhost sample
> -Original Message- > From: Yuanhan Liu [mailto:yuanhan.liu at linux.intel.com] > Sent: Monday, November 09, 2015 12:17 PM > To: Liu, Jijiang > Cc: dev at dpdk.org > Subject: Re: [dpdk-dev] [PATCH v3 8/8] examples/vhost:support TX offload in > vhost sample > > 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) != (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 = 0; > > > > @@ -197,6 +203,13 @@ typedef enum { > > static uint32_t enable_stats = 0; > > /* Enable retries on RX. */ > > static uint32_t enable_retry = 1; > > + > > +/* Disable TX checksum offload */ > ^^^ > You meant to "Enable"? > > > +static uint32_t enable_tx_csum; > > + > > +/* Disable TSO offload */ > > +static uint32_t enable_tso; > > 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. > > > + > > /* Specify timeout (in useconds) between retries on RX. */ static > > uint32_t burst_rx_delay_time = 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__)); > > > Minor nit: it's a cleanup, having nothing to do with this patch (to > demonstrate TSO/CSUM). It belongs to another patch. > > > - > > /* Header lengths. */ > > #define VLAN_HLEN 4 > > #define VLAN_ETH_HLEN 18 > > @@ -441,6 +440,14 @@ port_init(uint8_t port) > > > > if (port >= rte_eth_dev_count()) return -1; > > > > + if (enable_tx_csum == 0) > > + rte_vhost_feature_disable(1ULL << VIRTIO_NET_F_CSUM); > > + > > + if (enable_tso == 0) { > > + rte_vhost_feature_disable(1ULL << > VIRTIO_NET_F_HOST_TSO4); > > + rte_vhost_feature_disable(1ULL << > VIRTIO_NET_F_HOST_TSO6); > > + } > > + > > rx_rings = (uint16_t)dev_info.max_rx_queues; > > /* Configure ethernet device. */ > > retval = rte_eth_dev_configure(port, rx_rings, tx_rings, > > _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); > > } > > > > @
[dpdk-dev] [PATCH v3 8/8] examples/vhost:support TX offload in vhost sample
On Mon, Nov 09, 2015 at 08:17:24AM +, Liu, Jijiang wrote: > > > > -Original Message- > > From: Yuanhan Liu [mailto:yuanhan.liu at linux.intel.com] > > Sent: Monday, November 09, 2015 12:17 PM > > To: Liu, Jijiang > > Cc: dev at dpdk.org > > Subject: Re: [dpdk-dev] [PATCH v3 8/8] examples/vhost:support TX offload in > > vhost sample > > > > 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 @@ > > > > > 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. > > > This is configuration only in the vhost sample, but TSO/CSUM is enabled by > default in lib leyer. > > If user want to use it in vhost sample, just change the configuration. So, why do you want to disable it by default then? --yliu
[dpdk-dev] [PATCH v3 8/8] examples/vhost:support TX offload in vhost sample
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) != (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 = 0; > > @@ -197,6 +203,13 @@ typedef enum { > static uint32_t enable_stats = 0; > /* Enable retries on RX. */ > static uint32_t enable_retry = 1; > + > +/* Disable TX checksum offload */ ^^^ You meant to "Enable"? > +static uint32_t enable_tx_csum; > + > +/* Disable TSO offload */ > +static uint32_t enable_tso; 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. > + > /* Specify timeout (in useconds) between retries on RX. */ > static uint32_t burst_rx_delay_time = 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__)); Minor nit: it's a cleanup, having nothing to do with this patch (to demonstrate TSO/CSUM). It belongs to another patch. > - > /* Header lengths. */ > #define VLAN_HLEN 4 > #define VLAN_ETH_HLEN 18 > @@ -441,6 +440,14 @@ port_init(uint8_t port) > > if (port >= rte_eth_dev_count()) return -1; > > + if (enable_tx_csum == 0) > + rte_vhost_feature_disable(1ULL << VIRTIO_NET_F_CSUM); > + > + if (enable_tso == 0) { > + rte_vhost_feature_disable(1ULL << VIRTIO_NET_F_HOST_TSO4); > + rte_vhost_feature_disable(1ULL << VIRTIO_NET_F_HOST_TSO6); > + } > + > rx_rings = (uint16_t)dev_info.max_rx_queues; > /* Configure ethernet device. */ > retval = rte_eth_dev_configure(port, rx_rings, tx_rings, _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 = parse_num_opt(optarg, 1); > + if (ret == -1) { > + RTE_LOG(INFO, VHOST_CONFIG, "Invalid > argument for tx-csum [0|1]\n"); > + us_vhost_usage(prgname); > + return -1; > + } else > + enable_tx_csum = ret; > + } > + > + /* Enable/disable TSO offload. */ >
[dpdk-dev] [PATCH v3 8/8] examples/vhost:support TX offload in vhost sample
> > > > -/* 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__)); > > > Minor nit: it's a cleanup, having nothing to do with this patch (to > demonstrate TSO/CSUM). It belongs to another patch. > Ok, it could be a separate patch.
[dpdk-dev] [PATCH v3 8/8] examples/vhost:support TX offload in vhost sample
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) != (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 = 0; @@ -197,6 +203,13 @@ typedef enum { static uint32_t enable_stats = 0; /* Enable retries on RX. */ static uint32_t enable_retry = 1; + +/* Disable TX checksum offload */ +static uint32_t enable_tx_csum; + +/* Disable TSO offload */ +static uint32_t enable_tso; + /* Specify timeout (in useconds) between retries on RX. */ static uint32_t burst_rx_delay_time = 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__)); - /* Header lengths. */ #define VLAN_HLEN 4 #define VLAN_ETH_HLEN 18 @@ -441,6 +440,14 @@ port_init(uint8_t port) if (port >= rte_eth_dev_count()) return -1; + if (enable_tx_csum == 0) + rte_vhost_feature_disable(1ULL << VIRTIO_NET_F_CSUM); + + if (enable_tso == 0) { + rte_vhost_feature_disable(1ULL << VIRTIO_NET_F_HOST_TSO4); + rte_vhost_feature_disable(1ULL << VIRTIO_NET_F_HOST_TSO6); + } + rx_rings = (uint16_t)dev_info.max_rx_queues; /* Configure ethernet device. */ retval = rte_eth_dev_configure(port, rx_rings, tx_rings, _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 = parse_num_opt(optarg, 1); + if (ret == -1) { + RTE_LOG(INFO, VHOST_CONFIG, "Invalid argument for tx-csum [0|1]\n"); + us_vhost_usage(prgname); + return -1; + } else + enable_tx_csum = ret; + } + + /* Enable/disable TSO offload. */ + if (!strncmp(long_option[option_index].name, "tso", MAX_LONG_OPT_SZ)) { + ret = parse_num_opt(optarg, 1); + if (ret == -1) { + RTE_LOG(INFO, VHOST_CONFIG, "Invalid argument for tso [0|1]\n"); + us_vhost_usage(prgname); + return -1; + } else + enable_tso = ret; + } + /*
[dpdk-dev] [PATCH v3 8/8] examples/vhost:support TX offload in vhost sample
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) != (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 = 0; @@ -197,6 +203,13 @@ typedef enum { static uint32_t enable_stats = 0; /* Enable retries on RX. */ static uint32_t enable_retry = 1; + +/* Disable TX checksum offload */ +static uint32_t enable_tx_csum; + +/* Disable TSO offload */ +static uint32_t enable_tso; + /* Specify timeout (in useconds) between retries on RX. */ static uint32_t burst_rx_delay_time = 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__)); - /* Header lengths. */ #define VLAN_HLEN 4 #define VLAN_ETH_HLEN 18 @@ -441,6 +440,14 @@ port_init(uint8_t port) if (port >= rte_eth_dev_count()) return -1; + if (enable_tx_csum == 0) + rte_vhost_feature_disable(1ULL << VIRTIO_NET_F_CSUM); + + if (enable_tso == 0) { + rte_vhost_feature_disable(1ULL << VIRTIO_NET_F_HOST_TSO4); + rte_vhost_feature_disable(1ULL << VIRTIO_NET_F_HOST_TSO6); + } + rx_rings = (uint16_t)dev_info.max_rx_queues; /* Configure ethernet device. */ retval = rte_eth_dev_configure(port, rx_rings, tx_rings, _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 = parse_num_opt(optarg, 1); + if (ret == -1) { + RTE_LOG(INFO, VHOST_CONFIG, "Invalid argument for tx-csum [0|1]\n"); + us_vhost_usage(prgname); + return -1; + } else + enable_tx_csum = ret; + } + + /* Enable/disable TSO offload. */ + if (!strncmp(long_option[option_index].name, "tso", MAX_LONG_OPT_SZ)) { + ret = parse_num_opt(optarg, 1); + if (ret == -1) { + RTE_LOG(INFO, VHOST_CONFIG, "Invalid argument for tso [0|1]\n"); + us_vhost_usage(prgname); + return -1; + } else + enable_tso = ret; + } + /*