[dpdk-dev,v3,02/10] app/testpmd: convert to new Ethdev Rx offloads API

Message ID 8cb2768f5d38fcdbef83c0c7df4ce5ceb0dc5c59.1514281259.git.shahafs@mellanox.com (mailing list archive)
State Superseded, archived
Headers

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation fail apply patch file failure

Commit Message

Shahaf Shuler Dec. 26, 2017, 9:44 a.m. UTC
  Ethdev Rx offloads API has changed since:

commit ce17eddefc20 ("ethdev: introduce Rx queue offloads API")

Convert the application to use the new API. The is no functionality
changes rather simple conversion of the flags.

Signed-off-by: Shahaf Shuler <shahafs@mellanox.com>
---
 app/test-pmd/cmdline.c    | 51 +++++++++++++++++++++++-------------------
 app/test-pmd/config.c     | 36 +++++++++++++++++++----------
 app/test-pmd/parameters.c | 32 +++++++++++++-------------
 app/test-pmd/testpmd.c    | 19 +++++++---------
 4 files changed, 77 insertions(+), 61 deletions(-)
  

Comments

Wenzhuo Lu Jan. 9, 2018, 3:05 a.m. UTC | #1
Hi,


> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Shahaf Shuler
> Sent: Tuesday, December 26, 2017 5:44 PM
> To: Wu, Jingjing <jingjing.wu@intel.com>; Yigit, Ferruh
> <ferruh.yigit@intel.com>
> Cc: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH v3 02/10] app/testpmd: convert to new Ethdev
> Rx offloads API
> 
> Ethdev Rx offloads API has changed since:
> 
> commit ce17eddefc20 ("ethdev: introduce Rx queue offloads API")
> 
> Convert the application to use the new API. The is no functionality changes
> rather simple conversion of the flags.
> 
> Signed-off-by: Shahaf Shuler <shahafs@mellanox.com>
Acked-by: Wenzhuo Lu <wenzhuo.lu@intel.com>
  
Patil, Harish Jan. 19, 2018, 7:30 p.m. UTC | #2
-----Original Message-----
From: dev <dev-bounces@dpdk.org> on behalf of Shahaf Shuler

<shahafs@mellanox.com>
Date: Tuesday, December 26, 2017 at 1:44 AM
To: "jingjing.wu@intel.com" <jingjing.wu@intel.com>,
"ferruh.yigit@intel.com" <ferruh.yigit@intel.com>
Cc: "dev@dpdk.org" <dev@dpdk.org>
Subject: [dpdk-dev] [PATCH v3 02/10] app/testpmd: convert to new Ethdev
Rx	offloads API

>Ethdev Rx offloads API has changed since:

>

>commit ce17eddefc20 ("ethdev: introduce Rx queue offloads API")

>

>Convert the application to use the new API. The is no functionality

>changes rather simple conversion of the flags.

>

>Signed-off-by: Shahaf Shuler <shahafs@mellanox.com>

>---

> app/test-pmd/cmdline.c    | 51 +++++++++++++++++++++++-------------------

> app/test-pmd/config.c     | 36 +++++++++++++++++++----------

> app/test-pmd/parameters.c | 32 +++++++++++++-------------

> app/test-pmd/testpmd.c    | 19 +++++++---------

> 4 files changed, 77 insertions(+), 61 deletions(-)

>

>diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c

>index f71d96301..d8c73a9b1 100644

>--- a/app/test-pmd/cmdline.c

>+++ b/app/test-pmd/cmdline.c

>@@ -1577,6 +1577,7 @@ cmd_config_max_pkt_len_parsed(void *parsed_result,

> 				__attribute__((unused)) void *data)

> {

> 	struct cmd_config_max_pkt_len_result *res = parsed_result;

>+	uint64_t rx_offloads = rx_mode.offloads;

> 

> 	if (!all_ports_stopped()) {

> 		printf("Please stop all ports first\n");

>@@ -1594,14 +1595,16 @@ cmd_config_max_pkt_len_parsed(void *parsed_result,

> 

> 		rx_mode.max_rx_pkt_len = res->value;

> 		if (res->value > ETHER_MAX_LEN)

>-			rx_mode.jumbo_frame = 1;

>+			rx_offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME;

> 		else

>-			rx_mode.jumbo_frame = 0;

>+			rx_offloads &= ~DEV_RX_OFFLOAD_JUMBO_FRAME;

> 	} else {

> 		printf("Unknown parameter\n");

> 		return;

> 	}

> 

>+	rx_mode.offloads = rx_offloads;

>+

> 	init_port_config();

> 

> 	cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);

>@@ -1703,6 +1706,7 @@ cmd_config_rx_mode_flag_parsed(void *parsed_result,

> 				__attribute__((unused)) void *data)

> {

> 	struct cmd_config_rx_mode_flag *res = parsed_result;

>+	uint64_t rx_offloads = rx_mode.offloads;

> 

> 	if (!all_ports_stopped()) {

> 		printf("Please stop all ports first\n");

>@@ -1711,48 +1715,48 @@ cmd_config_rx_mode_flag_parsed(void

>*parsed_result,

> 

> 	if (!strcmp(res->name, "crc-strip")) {

> 		if (!strcmp(res->value, "on"))

>-			rx_mode.hw_strip_crc = 1;

>+			rx_offloads |= DEV_RX_OFFLOAD_CRC_STRIP;

> 		else if (!strcmp(res->value, "off"))

>-			rx_mode.hw_strip_crc = 0;

>+			rx_offloads &= ~DEV_RX_OFFLOAD_CRC_STRIP;

> 		else {

> 			printf("Unknown parameter\n");

> 			return;

> 		}

> 	} else if (!strcmp(res->name, "scatter")) {

>-		if (!strcmp(res->value, "on"))

>-			rx_mode.enable_scatter = 1;

>-		else if (!strcmp(res->value, "off"))

>-			rx_mode.enable_scatter = 0;

>-		else {

>+		if (!strcmp(res->value, "on")) {

>+			rx_offloads |= DEV_RX_OFFLOAD_SCATTER;

>+		} else if (!strcmp(res->value, "off")) {

>+			rx_offloads &= ~DEV_RX_OFFLOAD_SCATTER;

>+		} else {

> 			printf("Unknown parameter\n");

> 			return;

> 		}

> 	} else if (!strcmp(res->name, "rx-cksum")) {

> 		if (!strcmp(res->value, "on"))

>-			rx_mode.hw_ip_checksum = 1;

>+			rx_offloads |= DEV_RX_OFFLOAD_CHECKSUM;

> 		else if (!strcmp(res->value, "off"))

>-			rx_mode.hw_ip_checksum = 0;

>+			rx_offloads &= ~DEV_RX_OFFLOAD_CHECKSUM;

> 		else {

> 			printf("Unknown parameter\n");

> 			return;

> 		}

> 	} else if (!strcmp(res->name, "rx-timestamp")) {

> 		if (!strcmp(res->value, "on"))

>-			rx_mode.hw_timestamp = 1;

>+			rx_offloads |= DEV_RX_OFFLOAD_TIMESTAMP;

> 		else if (!strcmp(res->value, "off"))

>-			rx_mode.hw_timestamp = 0;

>+			rx_offloads &= ~DEV_RX_OFFLOAD_TIMESTAMP;

> 		else {

> 			printf("Unknown parameter\n");

> 			return;

> 		}

> 	} else if (!strcmp(res->name, "hw-vlan")) {

> 		if (!strcmp(res->value, "on")) {

>-			rx_mode.hw_vlan_filter = 1;

>-			rx_mode.hw_vlan_strip  = 1;

>+			rx_offloads |= (DEV_RX_OFFLOAD_VLAN_FILTER |

>+					DEV_RX_OFFLOAD_VLAN_STRIP);

> 		}

> 		else if (!strcmp(res->value, "off")) {

>-			rx_mode.hw_vlan_filter = 0;

>-			rx_mode.hw_vlan_strip  = 0;

>+			rx_offloads &= ~(DEV_RX_OFFLOAD_VLAN_FILTER |

>+					DEV_RX_OFFLOAD_VLAN_STRIP);

> 		}

> 		else {

> 			printf("Unknown parameter\n");

>@@ -1760,27 +1764,27 @@ cmd_config_rx_mode_flag_parsed(void

>*parsed_result,

> 		}

> 	} else if (!strcmp(res->name, "hw-vlan-filter")) {

> 		if (!strcmp(res->value, "on"))

>-			rx_mode.hw_vlan_filter = 1;

>+			rx_offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;

> 		else if (!strcmp(res->value, "off"))

>-			rx_mode.hw_vlan_filter = 0;

>+			rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_FILTER;

> 		else {

> 			printf("Unknown parameter\n");

> 			return;

> 		}

> 	} else if (!strcmp(res->name, "hw-vlan-strip")) {

> 		if (!strcmp(res->value, "on"))

>-			rx_mode.hw_vlan_strip  = 1;

>+			rx_offloads |= DEV_RX_OFFLOAD_VLAN_STRIP;

> 		else if (!strcmp(res->value, "off"))

>-			rx_mode.hw_vlan_strip  = 0;

>+			rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_STRIP;

> 		else {

> 			printf("Unknown parameter\n");

> 			return;

> 		}

> 	} else if (!strcmp(res->name, "hw-vlan-extend")) {

> 		if (!strcmp(res->value, "on"))

>-			rx_mode.hw_vlan_extend = 1;

>+			rx_offloads |= DEV_RX_OFFLOAD_VLAN_EXTEND;

> 		else if (!strcmp(res->value, "off"))

>-			rx_mode.hw_vlan_extend = 0;

>+			rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_EXTEND;

> 		else {

> 			printf("Unknown parameter\n");

> 			return;

>@@ -1798,6 +1802,7 @@ cmd_config_rx_mode_flag_parsed(void *parsed_result,

> 		printf("Unknown parameter\n");

> 		return;

> 	}

>+	rx_mode.offloads = rx_offloads;

> 

> 	init_port_config();

> 

>diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c

>index 387fefbaa..3bc99be76 100644

>--- a/app/test-pmd/config.c

>+++ b/app/test-pmd/config.c

>@@ -540,14 +540,12 @@ port_infos_display(portid_t port_id)

> void

> port_offload_cap_display(portid_t port_id)

> {

>-	struct rte_eth_dev *dev;

> 	struct rte_eth_dev_info dev_info;

> 	static const char *info_border = "************";

> 

> 	if (port_id_is_invalid(port_id, ENABLED_WARN))

> 		return;

> 

>-	dev = &rte_eth_devices[port_id];

> 	rte_eth_dev_info_get(port_id, &dev_info);

> 

> 	printf("\n%s Port %d supported offload features: %s\n",

>@@ -555,7 +553,8 @@ port_offload_cap_display(portid_t port_id)

> 

> 	if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_VLAN_STRIP) {

> 		printf("VLAN stripped:                 ");

>-		if (dev->data->dev_conf.rxmode.hw_vlan_strip)

>+		if (ports[port_id].dev_conf.rxmode.offloads &

>+		    DEV_RX_OFFLOAD_VLAN_STRIP)

> 			printf("on\n");

> 		else

> 			printf("off\n");

>@@ -563,7 +562,8 @@ port_offload_cap_display(portid_t port_id)

> 

> 	if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_QINQ_STRIP) {

> 		printf("Double VLANs stripped:         ");

>-		if (dev->data->dev_conf.rxmode.hw_vlan_extend)

>+		if (ports[port_id].dev_conf.rxmode.offloads &

>+		    DEV_RX_OFFLOAD_VLAN_EXTEND)

> 			printf("on\n");

> 		else

> 			printf("off\n");

>@@ -571,7 +571,8 @@ port_offload_cap_display(portid_t port_id)

> 

> 	if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_IPV4_CKSUM) {

> 		printf("RX IPv4 checksum:              ");

>-		if (dev->data->dev_conf.rxmode.hw_ip_checksum)

>+		if (ports[port_id].dev_conf.rxmode.offloads &

>+		    DEV_RX_OFFLOAD_IPV4_CKSUM)

> 			printf("on\n");

> 		else

> 			printf("off\n");

>@@ -579,7 +580,8 @@ port_offload_cap_display(portid_t port_id)

> 

> 	if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_UDP_CKSUM) {

> 		printf("RX UDP checksum:               ");

>-		if (dev->data->dev_conf.rxmode.hw_ip_checksum)

>+		if (ports[port_id].dev_conf.rxmode.offloads &

>+		    DEV_RX_OFFLOAD_UDP_CKSUM)

> 			printf("on\n");

> 		else

> 			printf("off\n");

>@@ -587,18 +589,26 @@ port_offload_cap_display(portid_t port_id)

> 

> 	if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_TCP_CKSUM) {

> 		printf("RX TCP checksum:               ");

>-		if (dev->data->dev_conf.rxmode.hw_ip_checksum)

>+		if (ports[port_id].dev_conf.rxmode.offloads &

>+		    DEV_RX_OFFLOAD_TCP_CKSUM)

> 			printf("on\n");

> 		else

> 			printf("off\n");

> 	}

> 

>-	if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM)

>-		printf("RX Outer IPv4 checksum:        on");

>+	if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM) {

>+		printf("RX Outer IPv4 checksum:               ");

>+		if (ports[port_id].dev_conf.rxmode.offloads &

>+		    DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM)

>+			printf("on\n");

>+		else

>+			printf("off\n");

>+	}

> 

> 	if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_TCP_LRO) {

> 		printf("Large receive offload:         ");

>-		if (dev->data->dev_conf.rxmode.enable_lro)

>+		if (ports[port_id].dev_conf.rxmode.offloads &

>+		    DEV_RX_OFFLOAD_TCP_LRO)

> 			printf("on\n");

> 		else

> 			printf("off\n");

>@@ -615,7 +625,8 @@ port_offload_cap_display(portid_t port_id)

> 

> 	if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_TIMESTAMP) {

> 		printf("HW timestamp:                  ");

>-		if (dev->data->dev_conf.rxmode.hw_timestamp)

>+		if (ports[port_id].dev_conf.rxmode.offloads &

>+		    DEV_RX_OFFLOAD_TIMESTAMP)

> 			printf("on\n");

> 		else

> 			printf("off\n");

>@@ -1676,7 +1687,8 @@ rxtx_config_display(void)

> 

> 		printf("  port %d:\n", (unsigned int)pid);

> 		printf("  CRC stripping %s\n",

>-				ports[pid].dev_conf.rxmode.hw_strip_crc ?

>+				(ports[pid].dev_conf.rxmode.offloads &

>+				 DEV_RX_OFFLOAD_CRC_STRIP) ?

> 				"enabled" : "disabled");

> 		printf("  RX queues=%d - RX desc=%d - RX free threshold=%d\n",

> 				nb_rxq, nb_rxd, rx_conf->rx_free_thresh);

>diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c

>index 84e7a63ef..263651cba 100644

>--- a/app/test-pmd/parameters.c

>+++ b/app/test-pmd/parameters.c

>@@ -566,6 +566,8 @@ launch_args_parse(int argc, char** argv)

> 	char **argvopt;

> 	int opt_idx;

> 	enum { TX, RX };

>+	/* Default Rx offloads for all ports. */

>+	uint64_t rx_offloads = rx_mode.offloads;

> 

> 	static struct option lgopts[] = {

> 		{ "help",			0, 0, 0 },

>@@ -804,7 +806,8 @@ launch_args_parse(int argc, char** argv)

> 				if (n >= ETHER_MIN_LEN) {

> 					rx_mode.max_rx_pkt_len = (uint32_t) n;

> 					if (n > ETHER_MAX_LEN)

>-					    rx_mode.jumbo_frame = 1;

>+						rx_offloads |=

>+							DEV_RX_OFFLOAD_JUMBO_FRAME;

> 				} else

> 					rte_exit(EXIT_FAILURE,

> 						 "Invalid max-pkt-len=%d - should be > %d\n",

>@@ -897,34 +900,30 @@ launch_args_parse(int argc, char** argv)

> 			}

> #endif

> 			if (!strcmp(lgopts[opt_idx].name, "disable-crc-strip"))

>-				rx_mode.hw_strip_crc = 0;

>+				rx_offloads &= ~DEV_RX_OFFLOAD_CRC_STRIP;

> 			if (!strcmp(lgopts[opt_idx].name, "enable-lro"))

>-				rx_mode.enable_lro = 1;

>+				rx_offloads |= DEV_RX_OFFLOAD_TCP_LRO;

> 			if (!strcmp(lgopts[opt_idx].name, "enable-scatter"))

>-				rx_mode.enable_scatter = 1;

>+				rx_offloads |= DEV_RX_OFFLOAD_SCATTER;

> 			if (!strcmp(lgopts[opt_idx].name, "enable-rx-cksum"))

>-				rx_mode.hw_ip_checksum = 1;

>+				rx_offloads |= DEV_RX_OFFLOAD_CHECKSUM;

> 			if (!strcmp(lgopts[opt_idx].name,

> 					"enable-rx-timestamp"))

>-				rx_mode.hw_timestamp = 1;

>-

>-			if (!strcmp(lgopts[opt_idx].name, "disable-hw-vlan")) {

>-				rx_mode.hw_vlan_filter = 0;

>-				rx_mode.hw_vlan_strip  = 0;

>-				rx_mode.hw_vlan_extend = 0;

>-			}

>+				rx_offloads |= DEV_RX_OFFLOAD_TIMESTAMP;

>+			if (!strcmp(lgopts[opt_idx].name, "disable-hw-vlan"))

>+				rx_offloads &= ~DEV_RX_OFFLOAD_VLAN;

> 

> 			if (!strcmp(lgopts[opt_idx].name,

> 					"disable-hw-vlan-filter"))

>-				rx_mode.hw_vlan_filter = 0;

>+				rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_FILTER;

> 

> 			if (!strcmp(lgopts[opt_idx].name,

> 					"disable-hw-vlan-strip"))

>-				rx_mode.hw_vlan_strip  = 0;

>+				rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_STRIP;

> 

> 			if (!strcmp(lgopts[opt_idx].name,

> 					"disable-hw-vlan-extend"))

>-				rx_mode.hw_vlan_extend = 0;

>+				rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_EXTEND;

> 

> 			if (!strcmp(lgopts[opt_idx].name, "enable-drop-en"))

> 				rx_drop_en = 1;

>@@ -1140,4 +1139,7 @@ launch_args_parse(int argc, char** argv)

> 			break;

> 		}

> 	}

>+

>+	/* Set offload configuration from command line parameters. */

>+	rx_mode.offloads = rx_offloads;

> }

>diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c

>index c3ab44849..6785b095f 100644

>--- a/app/test-pmd/testpmd.c

>+++ b/app/test-pmd/testpmd.c

>@@ -338,15 +338,10 @@ lcoreid_t latencystats_lcore_id = -1;

>  */

> struct rte_eth_rxmode rx_mode = {

> 	.max_rx_pkt_len = ETHER_MAX_LEN, /**< Default maximum frame length. */

>-	.split_hdr_size = 0,

>-	.header_split   = 0, /**< Header Split disabled. */

>-	.hw_ip_checksum = 0, /**< IP checksum offload disabled. */

>-	.hw_vlan_filter = 1, /**< VLAN filtering enabled. */

>-	.hw_vlan_strip  = 1, /**< VLAN strip enabled. */

>-	.hw_vlan_extend = 0, /**< Extended VLAN disabled. */

>-	.jumbo_frame    = 0, /**< Jumbo Frame Support disabled. */

>-	.hw_strip_crc   = 1, /**< CRC stripping by hardware enabled. */

>-	.hw_timestamp   = 0, /**< HW timestamp enabled. */

>+	.offloads = (DEV_RX_OFFLOAD_VLAN_FILTER |

>+		     DEV_RX_OFFLOAD_VLAN_STRIP |

>+		     DEV_RX_OFFLOAD_CRC_STRIP),

>+	.ignore_offload_bitfield = 1,

> };

> 

> struct rte_fdir_conf fdir_conf = {

>@@ -1521,6 +1516,8 @@ start_port(portid_t pid)

> 				port->need_reconfig_queues = 1;

> 				return -1;

> 			}

>+			/* Apply Rx offloads configuration */

>+			port->rx_conf.offloads = port->dev_conf.rxmode.offloads;

> 			/* setup rx queues */

> 			for (qi = 0; qi < nb_rxq; qi++) {

> 				if ((numa_support) &&

>@@ -2252,7 +2249,7 @@ init_port_dcb_config(portid_t pid,

> 	retval = get_eth_dcb_conf(&port_conf, dcb_mode, num_tcs, pfc_en);

> 	if (retval < 0)

> 		return retval;

>-	port_conf.rxmode.hw_vlan_filter = 1;

>+	port_conf.rxmode.offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;

> 

> 	/**

> 	 * Write the configuration into the device.

>@@ -2301,7 +2298,7 @@ init_port_dcb_config(portid_t pid,

> 

> 	rxtx_port_config(rte_port);

> 	/* VLAN filter */

>-	rte_port->dev_conf.rxmode.hw_vlan_filter = 1;

>+	rte_port->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;

> 	for (i = 0; i < RTE_DIM(vlan_tags); i++)

> 		rx_vft_set(pid, vlan_tags[i], 1);

> 

>-- 

>2.12.0

>


Hi Shahaf,
This testpmd change is causing some issues for qede PMD.
In this patch, rte_eth_dev_configure() and RX/TX queue setup functions are
called for the second time after applying TX offloads but without calling
rte_eth_dev_close() before.
Also there is no way in the driver to detect that this is a port
reconfiguration condition in which case it needs to do certain resources
deallocation/cleanup based on prior configuration.
Ideally, we don’t want to maintain port states in driver internally. So is
there any suggestions here?

Thanks,
Harish




>
  
Shahaf Shuler Jan. 20, 2018, 7:29 p.m. UTC | #3
Hi Harish, 


Friday, January 19, 2018 9:30 PM, Patil, Harish:
> >

> 

> Hi Shahaf,

> This testpmd change is causing some issues for qede PMD.

> In this patch, rte_eth_dev_configure() and RX/TX queue setup functions are

> called for the second time after applying TX offloads but without calling

> rte_eth_dev_close() before.


This issue is not related to the patch, rather to how DPDK and ethdev layer is defined.
In DPDK, after device probe the device is considered usable from ethdev. Then from ethdev the device can be configured (both port and queues) as long as it is not started yet.
The move between device start, stop, port config and queue config can happen multiple times without the need to move through device close.
In fact, the only way to make the device usable again after close is by another probe. 

> Also there is no way in the driver to detect that this is a port

> reconfiguration condition in which case it needs to do certain resources

> deallocation/cleanup based on prior configuration.


Am not sure I understand. 
You mean it is impossible from your side to detect port configuration in your PMD? Other PMDs do that.

> Ideally, we don’t want to maintain port states in driver internally. So is

> there any suggestions here?


Generally, I think this is a big issue in qede PMD. It is not following the rules of ethdev. 
I guess that with this misfunctionality you will have bugs also with real applications.  

As a temporary walk around you can configure the Tx offload you want through --tx-offloads command line parameter and avoid enablement using the CLI.
This way the port and queues will be reconfigured only once. 

> 

> Thanks,

> Harish

> 

> 

> 

> 

> >
  

Patch

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index f71d96301..d8c73a9b1 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -1577,6 +1577,7 @@  cmd_config_max_pkt_len_parsed(void *parsed_result,
 				__attribute__((unused)) void *data)
 {
 	struct cmd_config_max_pkt_len_result *res = parsed_result;
+	uint64_t rx_offloads = rx_mode.offloads;
 
 	if (!all_ports_stopped()) {
 		printf("Please stop all ports first\n");
@@ -1594,14 +1595,16 @@  cmd_config_max_pkt_len_parsed(void *parsed_result,
 
 		rx_mode.max_rx_pkt_len = res->value;
 		if (res->value > ETHER_MAX_LEN)
-			rx_mode.jumbo_frame = 1;
+			rx_offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME;
 		else
-			rx_mode.jumbo_frame = 0;
+			rx_offloads &= ~DEV_RX_OFFLOAD_JUMBO_FRAME;
 	} else {
 		printf("Unknown parameter\n");
 		return;
 	}
 
+	rx_mode.offloads = rx_offloads;
+
 	init_port_config();
 
 	cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);
@@ -1703,6 +1706,7 @@  cmd_config_rx_mode_flag_parsed(void *parsed_result,
 				__attribute__((unused)) void *data)
 {
 	struct cmd_config_rx_mode_flag *res = parsed_result;
+	uint64_t rx_offloads = rx_mode.offloads;
 
 	if (!all_ports_stopped()) {
 		printf("Please stop all ports first\n");
@@ -1711,48 +1715,48 @@  cmd_config_rx_mode_flag_parsed(void *parsed_result,
 
 	if (!strcmp(res->name, "crc-strip")) {
 		if (!strcmp(res->value, "on"))
-			rx_mode.hw_strip_crc = 1;
+			rx_offloads |= DEV_RX_OFFLOAD_CRC_STRIP;
 		else if (!strcmp(res->value, "off"))
-			rx_mode.hw_strip_crc = 0;
+			rx_offloads &= ~DEV_RX_OFFLOAD_CRC_STRIP;
 		else {
 			printf("Unknown parameter\n");
 			return;
 		}
 	} else if (!strcmp(res->name, "scatter")) {
-		if (!strcmp(res->value, "on"))
-			rx_mode.enable_scatter = 1;
-		else if (!strcmp(res->value, "off"))
-			rx_mode.enable_scatter = 0;
-		else {
+		if (!strcmp(res->value, "on")) {
+			rx_offloads |= DEV_RX_OFFLOAD_SCATTER;
+		} else if (!strcmp(res->value, "off")) {
+			rx_offloads &= ~DEV_RX_OFFLOAD_SCATTER;
+		} else {
 			printf("Unknown parameter\n");
 			return;
 		}
 	} else if (!strcmp(res->name, "rx-cksum")) {
 		if (!strcmp(res->value, "on"))
-			rx_mode.hw_ip_checksum = 1;
+			rx_offloads |= DEV_RX_OFFLOAD_CHECKSUM;
 		else if (!strcmp(res->value, "off"))
-			rx_mode.hw_ip_checksum = 0;
+			rx_offloads &= ~DEV_RX_OFFLOAD_CHECKSUM;
 		else {
 			printf("Unknown parameter\n");
 			return;
 		}
 	} else if (!strcmp(res->name, "rx-timestamp")) {
 		if (!strcmp(res->value, "on"))
-			rx_mode.hw_timestamp = 1;
+			rx_offloads |= DEV_RX_OFFLOAD_TIMESTAMP;
 		else if (!strcmp(res->value, "off"))
-			rx_mode.hw_timestamp = 0;
+			rx_offloads &= ~DEV_RX_OFFLOAD_TIMESTAMP;
 		else {
 			printf("Unknown parameter\n");
 			return;
 		}
 	} else if (!strcmp(res->name, "hw-vlan")) {
 		if (!strcmp(res->value, "on")) {
-			rx_mode.hw_vlan_filter = 1;
-			rx_mode.hw_vlan_strip  = 1;
+			rx_offloads |= (DEV_RX_OFFLOAD_VLAN_FILTER |
+					DEV_RX_OFFLOAD_VLAN_STRIP);
 		}
 		else if (!strcmp(res->value, "off")) {
-			rx_mode.hw_vlan_filter = 0;
-			rx_mode.hw_vlan_strip  = 0;
+			rx_offloads &= ~(DEV_RX_OFFLOAD_VLAN_FILTER |
+					DEV_RX_OFFLOAD_VLAN_STRIP);
 		}
 		else {
 			printf("Unknown parameter\n");
@@ -1760,27 +1764,27 @@  cmd_config_rx_mode_flag_parsed(void *parsed_result,
 		}
 	} else if (!strcmp(res->name, "hw-vlan-filter")) {
 		if (!strcmp(res->value, "on"))
-			rx_mode.hw_vlan_filter = 1;
+			rx_offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;
 		else if (!strcmp(res->value, "off"))
-			rx_mode.hw_vlan_filter = 0;
+			rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_FILTER;
 		else {
 			printf("Unknown parameter\n");
 			return;
 		}
 	} else if (!strcmp(res->name, "hw-vlan-strip")) {
 		if (!strcmp(res->value, "on"))
-			rx_mode.hw_vlan_strip  = 1;
+			rx_offloads |= DEV_RX_OFFLOAD_VLAN_STRIP;
 		else if (!strcmp(res->value, "off"))
-			rx_mode.hw_vlan_strip  = 0;
+			rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_STRIP;
 		else {
 			printf("Unknown parameter\n");
 			return;
 		}
 	} else if (!strcmp(res->name, "hw-vlan-extend")) {
 		if (!strcmp(res->value, "on"))
-			rx_mode.hw_vlan_extend = 1;
+			rx_offloads |= DEV_RX_OFFLOAD_VLAN_EXTEND;
 		else if (!strcmp(res->value, "off"))
-			rx_mode.hw_vlan_extend = 0;
+			rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_EXTEND;
 		else {
 			printf("Unknown parameter\n");
 			return;
@@ -1798,6 +1802,7 @@  cmd_config_rx_mode_flag_parsed(void *parsed_result,
 		printf("Unknown parameter\n");
 		return;
 	}
+	rx_mode.offloads = rx_offloads;
 
 	init_port_config();
 
diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index 387fefbaa..3bc99be76 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -540,14 +540,12 @@  port_infos_display(portid_t port_id)
 void
 port_offload_cap_display(portid_t port_id)
 {
-	struct rte_eth_dev *dev;
 	struct rte_eth_dev_info dev_info;
 	static const char *info_border = "************";
 
 	if (port_id_is_invalid(port_id, ENABLED_WARN))
 		return;
 
-	dev = &rte_eth_devices[port_id];
 	rte_eth_dev_info_get(port_id, &dev_info);
 
 	printf("\n%s Port %d supported offload features: %s\n",
@@ -555,7 +553,8 @@  port_offload_cap_display(portid_t port_id)
 
 	if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_VLAN_STRIP) {
 		printf("VLAN stripped:                 ");
-		if (dev->data->dev_conf.rxmode.hw_vlan_strip)
+		if (ports[port_id].dev_conf.rxmode.offloads &
+		    DEV_RX_OFFLOAD_VLAN_STRIP)
 			printf("on\n");
 		else
 			printf("off\n");
@@ -563,7 +562,8 @@  port_offload_cap_display(portid_t port_id)
 
 	if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_QINQ_STRIP) {
 		printf("Double VLANs stripped:         ");
-		if (dev->data->dev_conf.rxmode.hw_vlan_extend)
+		if (ports[port_id].dev_conf.rxmode.offloads &
+		    DEV_RX_OFFLOAD_VLAN_EXTEND)
 			printf("on\n");
 		else
 			printf("off\n");
@@ -571,7 +571,8 @@  port_offload_cap_display(portid_t port_id)
 
 	if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_IPV4_CKSUM) {
 		printf("RX IPv4 checksum:              ");
-		if (dev->data->dev_conf.rxmode.hw_ip_checksum)
+		if (ports[port_id].dev_conf.rxmode.offloads &
+		    DEV_RX_OFFLOAD_IPV4_CKSUM)
 			printf("on\n");
 		else
 			printf("off\n");
@@ -579,7 +580,8 @@  port_offload_cap_display(portid_t port_id)
 
 	if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_UDP_CKSUM) {
 		printf("RX UDP checksum:               ");
-		if (dev->data->dev_conf.rxmode.hw_ip_checksum)
+		if (ports[port_id].dev_conf.rxmode.offloads &
+		    DEV_RX_OFFLOAD_UDP_CKSUM)
 			printf("on\n");
 		else
 			printf("off\n");
@@ -587,18 +589,26 @@  port_offload_cap_display(portid_t port_id)
 
 	if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_TCP_CKSUM) {
 		printf("RX TCP checksum:               ");
-		if (dev->data->dev_conf.rxmode.hw_ip_checksum)
+		if (ports[port_id].dev_conf.rxmode.offloads &
+		    DEV_RX_OFFLOAD_TCP_CKSUM)
 			printf("on\n");
 		else
 			printf("off\n");
 	}
 
-	if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM)
-		printf("RX Outer IPv4 checksum:        on");
+	if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM) {
+		printf("RX Outer IPv4 checksum:               ");
+		if (ports[port_id].dev_conf.rxmode.offloads &
+		    DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM)
+			printf("on\n");
+		else
+			printf("off\n");
+	}
 
 	if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_TCP_LRO) {
 		printf("Large receive offload:         ");
-		if (dev->data->dev_conf.rxmode.enable_lro)
+		if (ports[port_id].dev_conf.rxmode.offloads &
+		    DEV_RX_OFFLOAD_TCP_LRO)
 			printf("on\n");
 		else
 			printf("off\n");
@@ -615,7 +625,8 @@  port_offload_cap_display(portid_t port_id)
 
 	if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_TIMESTAMP) {
 		printf("HW timestamp:                  ");
-		if (dev->data->dev_conf.rxmode.hw_timestamp)
+		if (ports[port_id].dev_conf.rxmode.offloads &
+		    DEV_RX_OFFLOAD_TIMESTAMP)
 			printf("on\n");
 		else
 			printf("off\n");
@@ -1676,7 +1687,8 @@  rxtx_config_display(void)
 
 		printf("  port %d:\n", (unsigned int)pid);
 		printf("  CRC stripping %s\n",
-				ports[pid].dev_conf.rxmode.hw_strip_crc ?
+				(ports[pid].dev_conf.rxmode.offloads &
+				 DEV_RX_OFFLOAD_CRC_STRIP) ?
 				"enabled" : "disabled");
 		printf("  RX queues=%d - RX desc=%d - RX free threshold=%d\n",
 				nb_rxq, nb_rxd, rx_conf->rx_free_thresh);
diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
index 84e7a63ef..263651cba 100644
--- a/app/test-pmd/parameters.c
+++ b/app/test-pmd/parameters.c
@@ -566,6 +566,8 @@  launch_args_parse(int argc, char** argv)
 	char **argvopt;
 	int opt_idx;
 	enum { TX, RX };
+	/* Default Rx offloads for all ports. */
+	uint64_t rx_offloads = rx_mode.offloads;
 
 	static struct option lgopts[] = {
 		{ "help",			0, 0, 0 },
@@ -804,7 +806,8 @@  launch_args_parse(int argc, char** argv)
 				if (n >= ETHER_MIN_LEN) {
 					rx_mode.max_rx_pkt_len = (uint32_t) n;
 					if (n > ETHER_MAX_LEN)
-					    rx_mode.jumbo_frame = 1;
+						rx_offloads |=
+							DEV_RX_OFFLOAD_JUMBO_FRAME;
 				} else
 					rte_exit(EXIT_FAILURE,
 						 "Invalid max-pkt-len=%d - should be > %d\n",
@@ -897,34 +900,30 @@  launch_args_parse(int argc, char** argv)
 			}
 #endif
 			if (!strcmp(lgopts[opt_idx].name, "disable-crc-strip"))
-				rx_mode.hw_strip_crc = 0;
+				rx_offloads &= ~DEV_RX_OFFLOAD_CRC_STRIP;
 			if (!strcmp(lgopts[opt_idx].name, "enable-lro"))
-				rx_mode.enable_lro = 1;
+				rx_offloads |= DEV_RX_OFFLOAD_TCP_LRO;
 			if (!strcmp(lgopts[opt_idx].name, "enable-scatter"))
-				rx_mode.enable_scatter = 1;
+				rx_offloads |= DEV_RX_OFFLOAD_SCATTER;
 			if (!strcmp(lgopts[opt_idx].name, "enable-rx-cksum"))
-				rx_mode.hw_ip_checksum = 1;
+				rx_offloads |= DEV_RX_OFFLOAD_CHECKSUM;
 			if (!strcmp(lgopts[opt_idx].name,
 					"enable-rx-timestamp"))
-				rx_mode.hw_timestamp = 1;
-
-			if (!strcmp(lgopts[opt_idx].name, "disable-hw-vlan")) {
-				rx_mode.hw_vlan_filter = 0;
-				rx_mode.hw_vlan_strip  = 0;
-				rx_mode.hw_vlan_extend = 0;
-			}
+				rx_offloads |= DEV_RX_OFFLOAD_TIMESTAMP;
+			if (!strcmp(lgopts[opt_idx].name, "disable-hw-vlan"))
+				rx_offloads &= ~DEV_RX_OFFLOAD_VLAN;
 
 			if (!strcmp(lgopts[opt_idx].name,
 					"disable-hw-vlan-filter"))
-				rx_mode.hw_vlan_filter = 0;
+				rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_FILTER;
 
 			if (!strcmp(lgopts[opt_idx].name,
 					"disable-hw-vlan-strip"))
-				rx_mode.hw_vlan_strip  = 0;
+				rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_STRIP;
 
 			if (!strcmp(lgopts[opt_idx].name,
 					"disable-hw-vlan-extend"))
-				rx_mode.hw_vlan_extend = 0;
+				rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_EXTEND;
 
 			if (!strcmp(lgopts[opt_idx].name, "enable-drop-en"))
 				rx_drop_en = 1;
@@ -1140,4 +1139,7 @@  launch_args_parse(int argc, char** argv)
 			break;
 		}
 	}
+
+	/* Set offload configuration from command line parameters. */
+	rx_mode.offloads = rx_offloads;
 }
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index c3ab44849..6785b095f 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -338,15 +338,10 @@  lcoreid_t latencystats_lcore_id = -1;
  */
 struct rte_eth_rxmode rx_mode = {
 	.max_rx_pkt_len = ETHER_MAX_LEN, /**< Default maximum frame length. */
-	.split_hdr_size = 0,
-	.header_split   = 0, /**< Header Split disabled. */
-	.hw_ip_checksum = 0, /**< IP checksum offload disabled. */
-	.hw_vlan_filter = 1, /**< VLAN filtering enabled. */
-	.hw_vlan_strip  = 1, /**< VLAN strip enabled. */
-	.hw_vlan_extend = 0, /**< Extended VLAN disabled. */
-	.jumbo_frame    = 0, /**< Jumbo Frame Support disabled. */
-	.hw_strip_crc   = 1, /**< CRC stripping by hardware enabled. */
-	.hw_timestamp   = 0, /**< HW timestamp enabled. */
+	.offloads = (DEV_RX_OFFLOAD_VLAN_FILTER |
+		     DEV_RX_OFFLOAD_VLAN_STRIP |
+		     DEV_RX_OFFLOAD_CRC_STRIP),
+	.ignore_offload_bitfield = 1,
 };
 
 struct rte_fdir_conf fdir_conf = {
@@ -1521,6 +1516,8 @@  start_port(portid_t pid)
 				port->need_reconfig_queues = 1;
 				return -1;
 			}
+			/* Apply Rx offloads configuration */
+			port->rx_conf.offloads = port->dev_conf.rxmode.offloads;
 			/* setup rx queues */
 			for (qi = 0; qi < nb_rxq; qi++) {
 				if ((numa_support) &&
@@ -2252,7 +2249,7 @@  init_port_dcb_config(portid_t pid,
 	retval = get_eth_dcb_conf(&port_conf, dcb_mode, num_tcs, pfc_en);
 	if (retval < 0)
 		return retval;
-	port_conf.rxmode.hw_vlan_filter = 1;
+	port_conf.rxmode.offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;
 
 	/**
 	 * Write the configuration into the device.
@@ -2301,7 +2298,7 @@  init_port_dcb_config(portid_t pid,
 
 	rxtx_port_config(rte_port);
 	/* VLAN filter */
-	rte_port->dev_conf.rxmode.hw_vlan_filter = 1;
+	rte_port->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;
 	for (i = 0; i < RTE_DIM(vlan_tags); i++)
 		rx_vft_set(pid, vlan_tags[i], 1);