[dpdk-dev,v2,04/10] app/testpmd: convert to new Ethdev Tx offloads API

Message ID 9dec91975cdd1a59e3cac99d0fd4bd8672544a4f.1513082773.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 Compilation issues

Commit Message

Shahaf Shuler Dec. 12, 2017, 12:52 p.m. UTC
  Ethdev Tx offloads API has changed since:

commit cba7f53b717d ("ethdev: introduce Tx queue offloads API")

Convert the application to use the new API.

This patch mandates the port to be stopped when configure the Tx
offloads. This is because the PMD must be aware to the offloads changes
on the device and queue configuration.

Signed-off-by: Shahaf Shuler <shahafs@mellanox.com>
---
 app/test-pmd/cmdline.c | 90 ++++++++++++++++++++++++++++++++++++++++++---
 app/test-pmd/config.c  | 55 ++++++++++++++++++---------
 app/test-pmd/testpmd.c |  3 ++
 3 files changed, 124 insertions(+), 24 deletions(-)
  

Comments

Maciej Czekaj Jan. 5, 2018, 6:11 p.m. UTC | #1
-- Oryginal message --
> Ethdev Tx offloads API has changed since:
>
> commit cba7f53b717d ("ethdev: introduce Tx queue offloads API")
>
> Convert the application to use the new API.
>
> This patch mandates the port to be stopped when configure the Tx
> offloads. This is because the PMD must be aware to the offloads changes
> on the device and queue configuration.
>
> Signed-off-by: Shahaf Shuler <shahafs@mellanox.com>
> ---
>   app/test-pmd/cmdline.c | 90 ++++++++++++++++++++++++++++++++++++++++++---
>   app/test-pmd/config.c  | 55 ++++++++++++++++++---------
>   app/test-pmd/testpmd.c |  3 ++
>   3 files changed, 124 insertions(+), 24 deletions(-)
>
> diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
> index d8c73a9..5812583 100644
> --- a/app/test-pmd/cmdline.c
> +++ b/app/test-pmd/cmdline.c
> @@ -3439,7 +3439,14 @@ struct cmd_tx_vlan_set_result {
>   {
>   	struct cmd_tx_vlan_set_result *res = parsed_result;
>   
> +	if (!port_is_stopped(res->port_id)) {
> +		printf("Please stop port %d first\n", res->port_id);
> +		return;
> +	}
> +
>   	tx_vlan_set(res->port_id, res->vlan_id);
> +
> +	cmd_reconfig_device_queue(res->port_id, 1, 1);
>   }
>   
>   cmdline_parse_token_string_t cmd_tx_vlan_set_tx_vlan =
> @@ -3486,7 +3493,14 @@ struct cmd_tx_vlan_set_qinq_result {
>   {
>   	struct cmd_tx_vlan_set_qinq_result *res = parsed_result;
>   
> +	if (!port_is_stopped(res->port_id)) {
> +		printf("Please stop port %d first\n", res->port_id);
> +		return;
> +	}
> +
>   	tx_qinq_set(res->port_id, res->vlan_id, res->vlan_id_outer);
> +
> +	cmd_reconfig_device_queue(res->port_id, 1, 1);
>   }
>   
>   cmdline_parse_token_string_t cmd_tx_vlan_set_qinq_tx_vlan =
> @@ -3592,7 +3606,14 @@ struct cmd_tx_vlan_reset_result {
>   {
>   	struct cmd_tx_vlan_reset_result *res = parsed_result;
>   
> +	if (!port_is_stopped(res->port_id)) {
> +		printf("Please stop port %d first\n", res->port_id);
> +		return;
> +	}
> +
>   	tx_vlan_reset(res->port_id);
> +
> +	cmd_reconfig_device_queue(res->port_id, 1, 1);
>   }
>   
>   cmdline_parse_token_string_t cmd_tx_vlan_reset_tx_vlan =
> @@ -3685,11 +3706,16 @@ struct cmd_csum_result {
>   	struct cmd_csum_result *res = parsed_result;
>   	int hw = 0;
>   	uint16_t mask = 0;
> +	uint64_t csum_offloads = 0;
>   
>   	if (port_id_is_invalid(res->port_id, ENABLED_WARN)) {
>   		printf("invalid port %d\n", res->port_id);
>   		return;
>   	}
> +	if (!port_is_stopped(res->port_id)) {
> +		printf("Please stop port %d first\n", res->port_id);
> +		return;
> +	}
>   
>   	if (!strcmp(res->mode, "set")) {
>   
> @@ -3698,22 +3724,34 @@ struct cmd_csum_result {
>   
>   		if (!strcmp(res->proto, "ip")) {
>   			mask = TESTPMD_TX_OFFLOAD_IP_CKSUM;
> +			csum_offloads |= DEV_TX_OFFLOAD_IPV4_CKSUM;
>   		} else if (!strcmp(res->proto, "udp")) {
>   			mask = TESTPMD_TX_OFFLOAD_UDP_CKSUM;
> +			csum_offloads |= DEV_TX_OFFLOAD_UDP_CKSUM;
>   		} else if (!strcmp(res->proto, "tcp")) {
>   			mask = TESTPMD_TX_OFFLOAD_TCP_CKSUM;
> +			csum_offloads |= DEV_TX_OFFLOAD_TCP_CKSUM;
>   		} else if (!strcmp(res->proto, "sctp")) {
>   			mask = TESTPMD_TX_OFFLOAD_SCTP_CKSUM;
> +			csum_offloads |= DEV_TX_OFFLOAD_SCTP_CKSUM;
>   		} else if (!strcmp(res->proto, "outer-ip")) {
>   			mask = TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM;
> +			csum_offloads |= DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM;
>   		}
>   
> -		if (hw)
> +		if (hw) {
>   			ports[res->port_id].tx_ol_flags |= mask;
> -		else
> +			ports[res->port_id].dev_conf.txmode.offloads |=
> +							csum_offloads;
> +		} else {
>   			ports[res->port_id].tx_ol_flags &= (~mask);
> +			ports[res->port_id].dev_conf.txmode.offloads &=
> +							(~csum_offloads);
> +		}
>   	}
>   	csum_show(res->port_id);
> +
> +	cmd_reconfig_device_queue(res->port_id, 1, 1);
>   }
>   
>   cmdline_parse_token_string_t cmd_csum_csum =
> @@ -3837,15 +3875,24 @@ struct cmd_tso_set_result {
>   
>   	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
>   		return;
> +	if (!port_is_stopped(res->port_id)) {
> +		printf("Please stop port %d first\n", res->port_id);
> +		return;
> +	}
>   
>   	if (!strcmp(res->mode, "set"))
>   		ports[res->port_id].tso_segsz = res->tso_segsz;
>   
> -	if (ports[res->port_id].tso_segsz == 0)
> +	if (ports[res->port_id].tso_segsz == 0) {
> +		ports[res->port_id].dev_conf.txmode.offloads &=
> +						~DEV_TX_OFFLOAD_TCP_TSO;
>   		printf("TSO for non-tunneled packets is disabled\n");
> -	else
> +	} else {
> +		ports[res->port_id].dev_conf.txmode.offloads |=
> +						DEV_TX_OFFLOAD_TCP_TSO;
>   		printf("TSO segment size for non-tunneled packets is %d\n",
>   			ports[res->port_id].tso_segsz);
> +	}
>   
>   	/* display warnings if configuration is not supported by the NIC */
>   	rte_eth_dev_info_get(res->port_id, &dev_info);
> @@ -3854,6 +3901,8 @@ struct cmd_tso_set_result {
>   		printf("Warning: TSO enabled but not "
>   			"supported by port %d\n", res->port_id);
>   	}
> +
> +	cmd_reconfig_device_queue(res->port_id, 1, 1);
>   }
>   
>   cmdline_parse_token_string_t cmd_tso_set_tso =
> @@ -3939,13 +3988,27 @@ struct cmd_tunnel_tso_set_result {
>   
>   	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
>   		return;
> +	if (!port_is_stopped(res->port_id)) {
> +		printf("Please stop port %d first\n", res->port_id);
> +		return;
> +	}
>   
>   	if (!strcmp(res->mode, "set"))
>   		ports[res->port_id].tunnel_tso_segsz = res->tso_segsz;
>   
> -	if (ports[res->port_id].tunnel_tso_segsz == 0)
> +	if (ports[res->port_id].tunnel_tso_segsz == 0) {
> +		ports[res->port_id].dev_conf.txmode.offloads &=
> +			~(DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
> +			  DEV_TX_OFFLOAD_GRE_TNL_TSO |
> +			  DEV_TX_OFFLOAD_IPIP_TNL_TSO |
> +			  DEV_TX_OFFLOAD_GENEVE_TNL_TSO);
>   		printf("TSO for tunneled packets is disabled\n");
> -	else {
> +	} else {
> +		ports[res->port_id].dev_conf.txmode.offloads |=
> +			(DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
> +			 DEV_TX_OFFLOAD_GRE_TNL_TSO |
> +			 DEV_TX_OFFLOAD_IPIP_TNL_TSO |
> +			 DEV_TX_OFFLOAD_GENEVE_TNL_TSO);
>   		printf("TSO segment size for tunneled packets is %d\n",
>   			ports[res->port_id].tunnel_tso_segsz);
>   
> @@ -3971,6 +4034,8 @@ struct cmd_tunnel_tso_set_result {
>   			printf("Warning: csum set outer-ip must be set to hw "
>   				"if outer L3 is IPv4; not necessary for IPv6\n");
>   	}
> +
> +	cmd_reconfig_device_queue(res->port_id, 1, 1);
>   }
>   
>   cmdline_parse_token_string_t cmd_tunnel_tso_set_tso =
> @@ -13012,8 +13077,13 @@ struct cmd_macsec_offload_on_result {
>   
>   	if (port_id_is_invalid(port_id, ENABLED_WARN))
>   		return;
> +	if (!port_is_stopped(port_id)) {
> +		printf("Please stop port %d first\n", port_id);
> +		return;
> +	}
>   
>   	ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_MACSEC;
> +	ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_MACSEC_INSERT;
>   #ifdef RTE_LIBRTE_IXGBE_PMD
>   	ret = rte_pmd_ixgbe_macsec_enable(port_id, en, rp);
>   #endif
> @@ -13022,6 +13092,7 @@ struct cmd_macsec_offload_on_result {
>   
>   	switch (ret) {
>   	case 0:
> +		cmd_reconfig_device_queue(port_id, 1, 1);
>   		break;
>   	case -ENODEV:
>   		printf("invalid port_id %d\n", port_id);
> @@ -13096,14 +13167,21 @@ struct cmd_macsec_offload_off_result {
>   
>   	if (port_id_is_invalid(port_id, ENABLED_WARN))
>   		return;
> +	if (!port_is_stopped(port_id)) {
> +		printf("Please stop port %d first\n", port_id);
> +		return;
> +	}
>   
>   	ports[port_id].tx_ol_flags &= ~TESTPMD_TX_OFFLOAD_MACSEC;
> +	ports[port_id].dev_conf.txmode.offloads &=
> +					~DEV_TX_OFFLOAD_MACSEC_INSERT;
>   #ifdef RTE_LIBRTE_IXGBE_PMD
>   	ret = rte_pmd_ixgbe_macsec_disable(port_id);
>   #endif
>   
>   	switch (ret) {
>   	case 0:
> +		cmd_reconfig_device_queue(port_id, 1, 1);
>   		break;
>   	case -ENODEV:
>   		printf("invalid port_id %d\n", port_id);
> diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
> index 2fdc051..ee7d083 100644
> --- a/app/test-pmd/config.c
> +++ b/app/test-pmd/config.c
> @@ -616,8 +616,8 @@ struct rss_type_info {
>   
>   	if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VLAN_INSERT) {
>   		printf("VLAN insert:                   ");
> -		if (ports[port_id].tx_ol_flags &
> -		    TESTPMD_TX_OFFLOAD_INSERT_VLAN)
> +		if (ports[port_id].dev_conf.txmode.offloads &
> +		    DEV_TX_OFFLOAD_VLAN_INSERT)
>   			printf("on\n");
>   		else
>   			printf("off\n");
> @@ -634,8 +634,8 @@ struct rss_type_info {
>   
>   	if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_QINQ_INSERT) {
>   		printf("Double VLANs insert:           ");
> -		if (ports[port_id].tx_ol_flags &
> -		    TESTPMD_TX_OFFLOAD_INSERT_QINQ)
> +		if (ports[port_id].dev_conf.txmode.offloads &
> +		    DEV_TX_OFFLOAD_QINQ_INSERT)
>   			printf("on\n");
>   		else
>   			printf("off\n");
> @@ -643,7 +643,8 @@ struct rss_type_info {
>   
>   	if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_IPV4_CKSUM) {
>   		printf("TX IPv4 checksum:              ");
> -		if (ports[port_id].tx_ol_flags & TESTPMD_TX_OFFLOAD_IP_CKSUM)
> +		if (ports[port_id].dev_conf.txmode.offloads &
> +		    DEV_TX_OFFLOAD_IPV4_CKSUM)
>   			printf("on\n");
>   		else
>   			printf("off\n");
> @@ -651,7 +652,8 @@ struct rss_type_info {
>   
>   	if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_UDP_CKSUM) {
>   		printf("TX UDP checksum:               ");
> -		if (ports[port_id].tx_ol_flags & TESTPMD_TX_OFFLOAD_UDP_CKSUM)
> +		if (ports[port_id].dev_conf.txmode.offloads &
> +		    DEV_TX_OFFLOAD_UDP_CKSUM)
>   			printf("on\n");
>   		else
>   			printf("off\n");
> @@ -659,7 +661,8 @@ struct rss_type_info {
>   
>   	if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_CKSUM) {
>   		printf("TX TCP checksum:               ");
> -		if (ports[port_id].tx_ol_flags & TESTPMD_TX_OFFLOAD_TCP_CKSUM)
> +		if (ports[port_id].dev_conf.txmode.offloads &
> +		    DEV_TX_OFFLOAD_TCP_CKSUM)
>   			printf("on\n");
>   		else
>   			printf("off\n");
> @@ -667,7 +670,8 @@ struct rss_type_info {
>   
>   	if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_SCTP_CKSUM) {
>   		printf("TX SCTP checksum:              ");
> -		if (ports[port_id].tx_ol_flags & TESTPMD_TX_OFFLOAD_SCTP_CKSUM)
> +		if (ports[port_id].dev_conf.txmode.offloads &
> +		    DEV_TX_OFFLOAD_SCTP_CKSUM)
>   			printf("on\n");
>   		else
>   			printf("off\n");
> @@ -675,8 +679,8 @@ struct rss_type_info {
>   
>   	if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) {
>   		printf("TX Outer IPv4 checksum:        ");
> -		if (ports[port_id].tx_ol_flags &
> -		    TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM)
> +		if (ports[port_id].dev_conf.txmode.offloads &
> +		    DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM)
>   			printf("on\n");
>   		else
>   			printf("off\n");
> @@ -684,7 +688,8 @@ struct rss_type_info {
>   
>   	if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_TSO) {
>   		printf("TX TCP segmentation:           ");
> -		if (ports[port_id].tso_segsz != 0)
> +		if (ports[port_id].dev_conf.txmode.offloads &
> +		    DEV_TX_OFFLOAD_TCP_TSO)
>   			printf("on\n");
>   		else
>   			printf("off\n");
> @@ -692,7 +697,8 @@ struct rss_type_info {
>   
>   	if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_UDP_TSO) {
>   		printf("TX UDP segmentation:           ");
> -		if (ports[port_id].tso_segsz != 0)
> +		if (ports[port_id].dev_conf.txmode.offloads &
> +		    DEV_TX_OFFLOAD_UDP_TSO)
>   			printf("on\n");
>   		else
>   			printf("off\n");
> @@ -700,7 +706,8 @@ struct rss_type_info {
>   
>   	if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VXLAN_TNL_TSO) {
>   		printf("TSO for VXLAN tunnel packet:   ");
> -		if (ports[port_id].tunnel_tso_segsz)
> +		if (ports[port_id].dev_conf.txmode.offloads &
> +		    DEV_TX_OFFLOAD_VXLAN_TNL_TSO)
>   			printf("on\n");
>   		else
>   			printf("off\n");
> @@ -708,7 +715,8 @@ struct rss_type_info {
>   
>   	if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_GRE_TNL_TSO) {
>   		printf("TSO for GRE tunnel packet:     ");
> -		if (ports[port_id].tunnel_tso_segsz)
> +		if (ports[port_id].dev_conf.txmode.offloads &
> +		    DEV_TX_OFFLOAD_GRE_TNL_TSO)
>   			printf("on\n");
>   		else
>   			printf("off\n");
> @@ -716,7 +724,8 @@ struct rss_type_info {
>   
>   	if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_IPIP_TNL_TSO) {
>   		printf("TSO for IPIP tunnel packet:    ");
> -		if (ports[port_id].tunnel_tso_segsz)
> +		if (ports[port_id].dev_conf.txmode.offloads &
> +		    DEV_TX_OFFLOAD_IPIP_TNL_TSO)
>   			printf("on\n");
>   		else
>   			printf("off\n");
> @@ -724,7 +733,8 @@ struct rss_type_info {
>   
>   	if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_GENEVE_TNL_TSO) {
>   		printf("TSO for GENEVE tunnel packet:  ");
> -		if (ports[port_id].tunnel_tso_segsz)
> +		if (ports[port_id].dev_conf.txmode.offloads &
> +		    DEV_TX_OFFLOAD_GENEVE_TNL_TSO)
>   			printf("on\n");
>   		else
>   			printf("off\n");
> @@ -1703,8 +1713,10 @@ struct igb_ring_desc_16_bytes {
>   				tx_conf->tx_thresh.pthresh,
>   				tx_conf->tx_thresh.hthresh,
>   				tx_conf->tx_thresh.wthresh);
> -		printf("  TX RS bit threshold=%d - TXQ flags=0x%"PRIx32"\n",
> -				tx_conf->tx_rs_thresh, tx_conf->txq_flags);
> +		printf("  TX RS bit threshold=%d - TXQ flags=0x%"PRIx32""
> +		       " - TXQ offloads=0x%"PRIx64"\n",
> +				tx_conf->tx_rs_thresh, tx_conf->txq_flags,
> +				tx_conf->offloads);
>   	}
>   }
>   
> @@ -2782,6 +2794,7 @@ struct igb_ring_desc_16_bytes {
>   tx_vlan_set(portid_t port_id, uint16_t vlan_id)
>   {
>   	int vlan_offload;
> +
>   	if (port_id_is_invalid(port_id, ENABLED_WARN))
>   		return;
>   	if (vlan_id_is_invalid(vlan_id))
> @@ -2795,6 +2808,7 @@ struct igb_ring_desc_16_bytes {
>   
>   	tx_vlan_reset(port_id);
>   	ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_INSERT_VLAN;
> +	ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_VLAN_INSERT;
>   	ports[port_id].tx_vlan_id = vlan_id;
>   }
>   
> @@ -2802,6 +2816,7 @@ struct igb_ring_desc_16_bytes {
>   tx_qinq_set(portid_t port_id, uint16_t vlan_id, uint16_t vlan_id_outer)
>   {
>   	int vlan_offload;
> +
>   	if (port_id_is_invalid(port_id, ENABLED_WARN))
>   		return;
>   	if (vlan_id_is_invalid(vlan_id))
> @@ -2817,6 +2832,7 @@ struct igb_ring_desc_16_bytes {
>   
>   	tx_vlan_reset(port_id);
>   	ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_INSERT_QINQ;
> +	ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_QINQ_INSERT;
>   	ports[port_id].tx_vlan_id = vlan_id;
>   	ports[port_id].tx_vlan_id_outer = vlan_id_outer;
>   }
> @@ -2828,6 +2844,9 @@ struct igb_ring_desc_16_bytes {
>   		return;
>   	ports[port_id].tx_ol_flags &= ~(TESTPMD_TX_OFFLOAD_INSERT_VLAN |
>   				TESTPMD_TX_OFFLOAD_INSERT_QINQ);
> +	ports[port_id].dev_conf.txmode.offloads &=
> +				~(DEV_TX_OFFLOAD_VLAN_INSERT |
> +				  DEV_TX_OFFLOAD_QINQ_INSERT);
>   	ports[port_id].tx_vlan_id = 0;
>   	ports[port_id].tx_vlan_id_outer = 0;
>   }
> diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
> index 77154ef..0087438 100644
> --- a/app/test-pmd/testpmd.c
> +++ b/app/test-pmd/testpmd.c
> @@ -1498,6 +1498,9 @@ static int eth_event_callback(portid_t port_id,
>   		}
>   		if (port->need_reconfig_queues > 0) {
>   			port->need_reconfig_queues = 0;
> +			port->tx_conf.txq_flags = ETH_TXQ_FLAGS_IGNORE;
> +			/* Apply Tx offloads configuration */
> +			port->tx_conf.offloads = port->dev_conf.txmode.offloads;

FAST_FREE flag got lost during conversion.

Per-queue configuration flags are initialized with PMD-specific default 
values in rxtx_port_config:

rxtx_port_config(struct rte_port *port)
{
     port->rx_conf = port->dev_info.default_rxconf;
     port->tx_conf = port->dev_info.default_txconf;
...

but port->dev_conf.txmode is taken from global variable txmode, not from 
PMD. See in init_config():

         /* Apply default Tx configuration for all ports */
         port->dev_conf.txmode = tx_mode;
         port->dev_conf.rxmode = rx_mode;

So the configuration will not be consistent, i.e. different flags in 
tx_queue_setup() and different in dev_configure().

If the intention is to keep defaults from PMD, let's fix this...
If not, please apply FAST_FREE flag  as in example patch v3, e.g:

+        rte_eth_dev_info_get(portid, &dev_info);
+        if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MBUF_FAST_FREE)
+            local_port_conf.txmode.offloads |=
+                DEV_TX_OFFLOAD_MBUF_FAST_FREE;

>   			/* setup tx queues */
>   			for (qi = 0; qi < nb_txq; qi++) {
>   				if ((numa_support) &&
  
Shahaf Shuler Jan. 7, 2018, 3:24 p.m. UTC | #2
Friday, January 5, 2018 8:11 PM, Maciej Czekaj:

>If the intention is to keep defaults from PMD, let's fix this...

>If not, please apply FAST_FREE flag  as in example patch v3, e.g:

>

>+        rte_eth_dev_info_get(portid, &dev_info);

>+        if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MBUF_FAST_FREE)

>+            local_port_conf.txmode.offloads |=

>+                DEV_TX_OFFLOAD_MBUF_FAST_FREE;


Will take care on next version

--Shahaf

From: Maciej Czekaj [mailto:maciej.czekaj@caviumnetworks.com]

Sent: Friday, January 5, 2018 8:11 PM
To: Shahaf Shuler <shahafs@mellanox.com>; ferruh.yigit@intel.com; jingjing.wu@intel.com
Cc: dev@dpdk.org
Subject: Re: [dpdk-dev] [PATCH v2 04/10] app/testpmd: convert to new Ethdev Tx offloads API



-- Oryginal message --

Ethdev Tx offloads API has changed since:



commit cba7f53b717d ("ethdev: introduce Tx queue offloads API")



Convert the application to use the new API.



This patch mandates the port to be stopped when configure the Tx

offloads. This is because the PMD must be aware to the offloads changes

on the device and queue configuration.



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


---

 app/test-pmd/cmdline.c | 90 ++++++++++++++++++++++++++++++++++++++++++---

 app/test-pmd/config.c  | 55 ++++++++++++++++++---------

 app/test-pmd/testpmd.c |  3 ++

 3 files changed, 124 insertions(+), 24 deletions(-)



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

index d8c73a9..5812583 100644

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

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

@@ -3439,7 +3439,14 @@ struct cmd_tx_vlan_set_result {

 {

        struct cmd_tx_vlan_set_result *res = parsed_result;



+       if (!port_is_stopped(res->port_id)) {

+               printf("Please stop port %d first\n", res->port_id);

+               return;

+       }

+

        tx_vlan_set(res->port_id, res->vlan_id);

+

+       cmd_reconfig_device_queue(res->port_id, 1, 1);

 }



 cmdline_parse_token_string_t cmd_tx_vlan_set_tx_vlan =

@@ -3486,7 +3493,14 @@ struct cmd_tx_vlan_set_qinq_result {

 {

        struct cmd_tx_vlan_set_qinq_result *res = parsed_result;



+       if (!port_is_stopped(res->port_id)) {

+               printf("Please stop port %d first\n", res->port_id);

+               return;

+       }

+

        tx_qinq_set(res->port_id, res->vlan_id, res->vlan_id_outer);

+

+       cmd_reconfig_device_queue(res->port_id, 1, 1);

 }



 cmdline_parse_token_string_t cmd_tx_vlan_set_qinq_tx_vlan =

@@ -3592,7 +3606,14 @@ struct cmd_tx_vlan_reset_result {

 {

        struct cmd_tx_vlan_reset_result *res = parsed_result;



+       if (!port_is_stopped(res->port_id)) {

+               printf("Please stop port %d first\n", res->port_id);

+               return;

+       }

+

        tx_vlan_reset(res->port_id);

+

+       cmd_reconfig_device_queue(res->port_id, 1, 1);

 }



 cmdline_parse_token_string_t cmd_tx_vlan_reset_tx_vlan =

@@ -3685,11 +3706,16 @@ struct cmd_csum_result {

        struct cmd_csum_result *res = parsed_result;

        int hw = 0;

        uint16_t mask = 0;

+       uint64_t csum_offloads = 0;



        if (port_id_is_invalid(res->port_id, ENABLED_WARN)) {

                printf("invalid port %d\n", res->port_id);

                return;

        }

+       if (!port_is_stopped(res->port_id)) {

+               printf("Please stop port %d first\n", res->port_id);

+               return;

+       }



        if (!strcmp(res->mode, "set")) {



@@ -3698,22 +3724,34 @@ struct cmd_csum_result {



                if (!strcmp(res->proto, "ip")) {

                        mask = TESTPMD_TX_OFFLOAD_IP_CKSUM;

+                       csum_offloads |= DEV_TX_OFFLOAD_IPV4_CKSUM;

                } else if (!strcmp(res->proto, "udp")) {

                        mask = TESTPMD_TX_OFFLOAD_UDP_CKSUM;

+                       csum_offloads |= DEV_TX_OFFLOAD_UDP_CKSUM;

                } else if (!strcmp(res->proto, "tcp")) {

                        mask = TESTPMD_TX_OFFLOAD_TCP_CKSUM;

+                       csum_offloads |= DEV_TX_OFFLOAD_TCP_CKSUM;

                } else if (!strcmp(res->proto, "sctp")) {

                        mask = TESTPMD_TX_OFFLOAD_SCTP_CKSUM;

+                       csum_offloads |= DEV_TX_OFFLOAD_SCTP_CKSUM;

                } else if (!strcmp(res->proto, "outer-ip")) {

                        mask = TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM;

+                       csum_offloads |= DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM;

                }



-               if (hw)

+               if (hw) {

                        ports[res->port_id].tx_ol_flags |= mask;

-               else

+                       ports[res->port_id].dev_conf.txmode.offloads |=

+                                                     csum_offloads;

+               } else {

                        ports[res->port_id].tx_ol_flags &= (~mask);

+                       ports[res->port_id].dev_conf.txmode.offloads &=

+                                                     (~csum_offloads);

+               }

        }

        csum_show(res->port_id);

+

+       cmd_reconfig_device_queue(res->port_id, 1, 1);

 }



 cmdline_parse_token_string_t cmd_csum_csum =

@@ -3837,15 +3875,24 @@ struct cmd_tso_set_result {



        if (port_id_is_invalid(res->port_id, ENABLED_WARN))

                return;

+       if (!port_is_stopped(res->port_id)) {

+               printf("Please stop port %d first\n", res->port_id);

+               return;

+       }



        if (!strcmp(res->mode, "set"))

                ports[res->port_id].tso_segsz = res->tso_segsz;



-       if (ports[res->port_id].tso_segsz == 0)

+       if (ports[res->port_id].tso_segsz == 0) {

+               ports[res->port_id].dev_conf.txmode.offloads &=

+                                              ~DEV_TX_OFFLOAD_TCP_TSO;

                printf("TSO for non-tunneled packets is disabled\n");

-       else

+       } else {

+               ports[res->port_id].dev_conf.txmode.offloads |=

+                                              DEV_TX_OFFLOAD_TCP_TSO;

                printf("TSO segment size for non-tunneled packets is %d\n",

                        ports[res->port_id].tso_segsz);

+       }



        /* display warnings if configuration is not supported by the NIC */

        rte_eth_dev_info_get(res->port_id, &dev_info);

@@ -3854,6 +3901,8 @@ struct cmd_tso_set_result {

                printf("Warning: TSO enabled but not "

                        "supported by port %d\n", res->port_id);

        }

+

+       cmd_reconfig_device_queue(res->port_id, 1, 1);

 }



 cmdline_parse_token_string_t cmd_tso_set_tso =

@@ -3939,13 +3988,27 @@ struct cmd_tunnel_tso_set_result {



        if (port_id_is_invalid(res->port_id, ENABLED_WARN))

                return;

+       if (!port_is_stopped(res->port_id)) {

+               printf("Please stop port %d first\n", res->port_id);

+               return;

+       }



        if (!strcmp(res->mode, "set"))

                ports[res->port_id].tunnel_tso_segsz = res->tso_segsz;



-       if (ports[res->port_id].tunnel_tso_segsz == 0)

+       if (ports[res->port_id].tunnel_tso_segsz == 0) {

+               ports[res->port_id].dev_conf.txmode.offloads &=

+                       ~(DEV_TX_OFFLOAD_VXLAN_TNL_TSO |

+                         DEV_TX_OFFLOAD_GRE_TNL_TSO |

+                         DEV_TX_OFFLOAD_IPIP_TNL_TSO |

+                         DEV_TX_OFFLOAD_GENEVE_TNL_TSO);

                printf("TSO for tunneled packets is disabled\n");

-       else {

+       } else {

+               ports[res->port_id].dev_conf.txmode.offloads |=

+                       (DEV_TX_OFFLOAD_VXLAN_TNL_TSO |

+                        DEV_TX_OFFLOAD_GRE_TNL_TSO |

+                        DEV_TX_OFFLOAD_IPIP_TNL_TSO |

+                        DEV_TX_OFFLOAD_GENEVE_TNL_TSO);

                printf("TSO segment size for tunneled packets is %d\n",

                        ports[res->port_id].tunnel_tso_segsz);



@@ -3971,6 +4034,8 @@ struct cmd_tunnel_tso_set_result {

                        printf("Warning: csum set outer-ip must be set to hw "

                               "if outer L3 is IPv4; not necessary for IPv6\n");

        }

+

+       cmd_reconfig_device_queue(res->port_id, 1, 1);

 }



 cmdline_parse_token_string_t cmd_tunnel_tso_set_tso =

@@ -13012,8 +13077,13 @@ struct cmd_macsec_offload_on_result {



        if (port_id_is_invalid(port_id, ENABLED_WARN))

                return;

+       if (!port_is_stopped(port_id)) {

+               printf("Please stop port %d first\n", port_id);

+               return;

+       }



        ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_MACSEC;

+       ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_MACSEC_INSERT;

 #ifdef RTE_LIBRTE_IXGBE_PMD

        ret = rte_pmd_ixgbe_macsec_enable(port_id, en, rp);

 #endif

@@ -13022,6 +13092,7 @@ struct cmd_macsec_offload_on_result {



        switch (ret) {

        case 0:

+               cmd_reconfig_device_queue(port_id, 1, 1);

                break;

        case -ENODEV:

                printf("invalid port_id %d\n", port_id);

@@ -13096,14 +13167,21 @@ struct cmd_macsec_offload_off_result {



        if (port_id_is_invalid(port_id, ENABLED_WARN))

                return;

+       if (!port_is_stopped(port_id)) {

+               printf("Please stop port %d first\n", port_id);

+               return;

+       }



        ports[port_id].tx_ol_flags &= ~TESTPMD_TX_OFFLOAD_MACSEC;

+       ports[port_id].dev_conf.txmode.offloads &=

+                                      ~DEV_TX_OFFLOAD_MACSEC_INSERT;

 #ifdef RTE_LIBRTE_IXGBE_PMD

        ret = rte_pmd_ixgbe_macsec_disable(port_id);

 #endif



        switch (ret) {

        case 0:

+               cmd_reconfig_device_queue(port_id, 1, 1);

                break;

        case -ENODEV:

                printf("invalid port_id %d\n", port_id);

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

index 2fdc051..ee7d083 100644

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

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

@@ -616,8 +616,8 @@ struct rss_type_info {



        if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VLAN_INSERT) {

                printf("VLAN insert:                   ");

-               if (ports[port_id].tx_ol_flags &

-                   TESTPMD_TX_OFFLOAD_INSERT_VLAN)

+               if (ports[port_id].dev_conf.txmode.offloads &

+                   DEV_TX_OFFLOAD_VLAN_INSERT)

                        printf("on\n");

                else

                        printf("off\n");<mailto:);@@-634,8+634,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_QINQ_INSERT)%7bprintf(>

@@ -634,8 +634,8 @@ struct rss_type_info {<mailto:);@@-634,8+634,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_QINQ_INSERT)%7bprintf(>

 <mailto:);@@-634,8+634,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_QINQ_INSERT)%7bprintf(>

        if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_QINQ_INSERT) {<mailto:);@@-634,8+634,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_QINQ_INSERT)%7bprintf(>

                printf("<mailto:);@@-634,8+634,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_QINQ_INSERT)%7bprintf(>Double VLANs insert:           ");

-               if (ports[port_id].tx_ol_flags &

-                   TESTPMD_TX_OFFLOAD_INSERT_QINQ)

+               if (ports[port_id].dev_conf.txmode.offloads &

+                   DEV_TX_OFFLOAD_QINQ_INSERT)

                        printf("on\n");

                else

                        printf("off\n");<mailto:);@@-643,7+643,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_IPV4_CKSUM)%7bprintf(>

@@ -643,7 +643,8 @@ struct rss_type_info {<mailto:);@@-643,7+643,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_IPV4_CKSUM)%7bprintf(>

 <mailto:);@@-643,7+643,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_IPV4_CKSUM)%7bprintf(>

        if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_IPV4_CKSUM) {<mailto:);@@-643,7+643,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_IPV4_CKSUM)%7bprintf(>

                printf("<mailto:);@@-643,7+643,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_IPV4_CKSUM)%7bprintf(>TX IPv4 checksum:              ");

-               if (ports[port_id].tx_ol_flags & TESTPMD_TX_OFFLOAD_IP_CKSUM)

+               if (ports[port_id].dev_conf.txmode.offloads &

+                   DEV_TX_OFFLOAD_IPV4_CKSUM)

                        printf("on\n");

                else

                        printf("off\n");<mailto:);@@-651,7+652,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_UDP_CKSUM)%7bprintf(>

@@ -651,7 +652,8 @@ struct rss_type_info {<mailto:);@@-651,7+652,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_UDP_CKSUM)%7bprintf(>

 <mailto:);@@-651,7+652,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_UDP_CKSUM)%7bprintf(>

        if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_UDP_CKSUM) {<mailto:);@@-651,7+652,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_UDP_CKSUM)%7bprintf(>

                printf("<mailto:);@@-651,7+652,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_UDP_CKSUM)%7bprintf(>TX UDP checksum:               ");

-               if (ports[port_id].tx_ol_flags & TESTPMD_TX_OFFLOAD_UDP_CKSUM)

+               if (ports[port_id].dev_conf.txmode.offloads &

+                   DEV_TX_OFFLOAD_UDP_CKSUM)

                        printf("on\n");

                else

                        printf("off\n");<mailto:);@@-659,7+661,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_TCP_CKSUM)%7bprintf(>

@@ -659,7 +661,8 @@ struct rss_type_info {<mailto:);@@-659,7+661,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_TCP_CKSUM)%7bprintf(>

 <mailto:);@@-659,7+661,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_TCP_CKSUM)%7bprintf(>

        if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_CKSUM) {<mailto:);@@-659,7+661,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_TCP_CKSUM)%7bprintf(>

                printf("<mailto:);@@-659,7+661,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_TCP_CKSUM)%7bprintf(>TX TCP checksum:               ");

-               if (ports[port_id].tx_ol_flags & TESTPMD_TX_OFFLOAD_TCP_CKSUM)

+               if (ports[port_id].dev_conf.txmode.offloads &

+                   DEV_TX_OFFLOAD_TCP_CKSUM)

                        printf("on\n");

                else

                        printf("off\n");<mailto:);@@-667,7+670,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_SCTP_CKSUM)%7bprintf(>

@@ -667,7 +670,8 @@ struct rss_type_info {<mailto:);@@-667,7+670,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_SCTP_CKSUM)%7bprintf(>

 <mailto:);@@-667,7+670,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_SCTP_CKSUM)%7bprintf(>

        if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_SCTP_CKSUM) {<mailto:);@@-667,7+670,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_SCTP_CKSUM)%7bprintf(>

                printf("<mailto:);@@-667,7+670,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_SCTP_CKSUM)%7bprintf(>TX SCTP checksum:              ");

-               if (ports[port_id].tx_ol_flags & TESTPMD_TX_OFFLOAD_SCTP_CKSUM)

+               if (ports[port_id].dev_conf.txmode.offloads &

+                   DEV_TX_OFFLOAD_SCTP_CKSUM)

                        printf("on\n");

                else

                        printf("off\n");<mailto:);@@-675,8+679,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM)%7bprintf(>

@@ -675,8 +679,8 @@ struct rss_type_info {<mailto:);@@-675,8+679,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM)%7bprintf(>

 <mailto:);@@-675,8+679,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM)%7bprintf(>

        if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) {<mailto:);@@-675,8+679,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM)%7bprintf(>

                printf("<mailto:);@@-675,8+679,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM)%7bprintf(>TX Outer IPv4 checksum:        ");

-               if (ports[port_id].tx_ol_flags &

-                   TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM)

+               if (ports[port_id].dev_conf.txmode.offloads &

+                   DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM)

                        printf("on\n");

                else

                        printf("off\n");<mailto:);@@-684,7+688,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_TCP_TSO)%7bprintf(>

@@ -684,7 +688,8 @@ struct rss_type_info {<mailto:);@@-684,7+688,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_TCP_TSO)%7bprintf(>

 <mailto:);@@-684,7+688,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_TCP_TSO)%7bprintf(>

        if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_TSO) {<mailto:);@@-684,7+688,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_TCP_TSO)%7bprintf(>

                printf("<mailto:);@@-684,7+688,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_TCP_TSO)%7bprintf(>TX TCP segmentation:           ");

-               if (ports[port_id].tso_segsz != 0)

+               if (ports[port_id].dev_conf.txmode.offloads &

+                   DEV_TX_OFFLOAD_TCP_TSO)

                        printf("on\n");

                else

                        printf("off\n");<mailto:);@@-692,7+697,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_UDP_TSO)%7bprintf(>

@@ -692,7 +697,8 @@ struct rss_type_info {<mailto:);@@-692,7+697,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_UDP_TSO)%7bprintf(>

 <mailto:);@@-692,7+697,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_UDP_TSO)%7bprintf(>

        if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_UDP_TSO) {<mailto:);@@-692,7+697,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_UDP_TSO)%7bprintf(>

                printf("<mailto:);@@-692,7+697,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_UDP_TSO)%7bprintf(>TX UDP segmentation:           ");

-               if (ports[port_id].tso_segsz != 0)

+               if (ports[port_id].dev_conf.txmode.offloads &

+                   DEV_TX_OFFLOAD_UDP_TSO)

                        printf("on\n");

                else

                        printf("off\n");<mailto:);@@-700,7+706,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_VXLAN_TNL_TSO)%7bprintf(>

@@ -700,7 +706,8 @@ struct rss_type_info {<mailto:);@@-700,7+706,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_VXLAN_TNL_TSO)%7bprintf(>

 <mailto:);@@-700,7+706,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_VXLAN_TNL_TSO)%7bprintf(>

        if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VXLAN_TNL_TSO) {<mailto:);@@-700,7+706,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_VXLAN_TNL_TSO)%7bprintf(>

                printf("<mailto:);@@-700,7+706,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_VXLAN_TNL_TSO)%7bprintf(>TSO for VXLAN tunnel packet:   ");

-               if (ports[port_id].tunnel_tso_segsz)

+               if (ports[port_id].dev_conf.txmode.offloads &

+                   DEV_TX_OFFLOAD_VXLAN_TNL_TSO)

                        printf("on\n");

                else

                        printf("off\n");<mailto:);@@-708,7+715,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_GRE_TNL_TSO)%7bprintf(>

@@ -708,7 +715,8 @@ struct rss_type_info {<mailto:);@@-708,7+715,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_GRE_TNL_TSO)%7bprintf(>

 <mailto:);@@-708,7+715,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_GRE_TNL_TSO)%7bprintf(>

        if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_GRE_TNL_TSO) {<mailto:);@@-708,7+715,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_GRE_TNL_TSO)%7bprintf(>

                printf("<mailto:);@@-708,7+715,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_GRE_TNL_TSO)%7bprintf(>TSO for GRE tunnel packet:     ");

-               if (ports[port_id].tunnel_tso_segsz)

+               if (ports[port_id].dev_conf.txmode.offloads &

+                   DEV_TX_OFFLOAD_GRE_TNL_TSO)

                        printf("on\n");

                else

                        printf("off\n");<mailto:);@@-716,7+724,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_IPIP_TNL_TSO)%7bprintf(>

@@ -716,7 +724,8 @@ struct rss_type_info {<mailto:);@@-716,7+724,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_IPIP_TNL_TSO)%7bprintf(>

 <mailto:);@@-716,7+724,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_IPIP_TNL_TSO)%7bprintf(>

        if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_IPIP_TNL_TSO) {<mailto:);@@-716,7+724,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_IPIP_TNL_TSO)%7bprintf(>

                printf("<mailto:);@@-716,7+724,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_IPIP_TNL_TSO)%7bprintf(>TSO for IPIP tunnel packet:    ");

-               if (ports[port_id].tunnel_tso_segsz)

+               if (ports[port_id].dev_conf.txmode.offloads &

+                   DEV_TX_OFFLOAD_IPIP_TNL_TSO)

                        printf("on\n");

                else

                        printf("off\n");<mailto:);@@-724,7+733,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_GENEVE_TNL_TSO)%7bprintf(>

@@ -724,7 +733,8 @@ struct rss_type_info {<mailto:);@@-724,7+733,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_GENEVE_TNL_TSO)%7bprintf(>

 <mailto:);@@-724,7+733,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_GENEVE_TNL_TSO)%7bprintf(>

        if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_GENEVE_TNL_TSO) {<mailto:);@@-724,7+733,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_GENEVE_TNL_TSO)%7bprintf(>

                printf("<mailto:);@@-724,7+733,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_GENEVE_TNL_TSO)%7bprintf(>TSO for GENEVE tunnel packet:  ");

-               if (ports[port_id].tunnel_tso_segsz)

+               if (ports[port_id].dev_conf.txmode.offloads &

+                   DEV_TX_OFFLOAD_GENEVE_TNL_TSO)

                        printf("on\n");

                else

                        printf("off\n");

@@ -1703,8 +1713,10 @@ struct igb_ring_desc_16_bytes {

                               tx_conf->tx_thresh.pthresh,

                               tx_conf->tx_thresh.hthresh,

                               tx_conf->tx_thresh.wthresh);

-               printf("  TX RS bit threshold=%d - TXQ flags=0x%"PRIx32"\n",

-                              tx_conf->tx_rs_thresh, tx_conf->txq_flags);

+               printf("  TX RS bit threshold=%d - TXQ flags=0x%"PRIx32""

+                      " - TXQ offloads=0x%"PRIx64"\n",

+                              tx_conf->tx_rs_thresh, tx_conf->txq_flags,

+                              tx_conf->offloads);

        }

 }



@@ -2782,6 +2794,7 @@ struct igb_ring_desc_16_bytes {

 tx_vlan_set(portid_t port_id, uint16_t vlan_id)

 {

        int vlan_offload;

+

        if (port_id_is_invalid(port_id, ENABLED_WARN))

                return;

        if (vlan_id_is_invalid(vlan_id))

@@ -2795,6 +2808,7 @@ struct igb_ring_desc_16_bytes {



        tx_vlan_reset(port_id);

        ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_INSERT_VLAN;

+       ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_VLAN_INSERT;

        ports[port_id].tx_vlan_id = vlan_id;

 }



@@ -2802,6 +2816,7 @@ struct igb_ring_desc_16_bytes {

 tx_qinq_set(portid_t port_id, uint16_t vlan_id, uint16_t vlan_id_outer)

 {

        int vlan_offload;

+

        if (port_id_is_invalid(port_id, ENABLED_WARN))

                return;

        if (vlan_id_is_invalid(vlan_id))

@@ -2817,6 +2832,7 @@ struct igb_ring_desc_16_bytes {



        tx_vlan_reset(port_id);

        ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_INSERT_QINQ;

+       ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_QINQ_INSERT;

        ports[port_id].tx_vlan_id = vlan_id;

        ports[port_id].tx_vlan_id_outer = vlan_id_outer;

 }

@@ -2828,6 +2844,9 @@ struct igb_ring_desc_16_bytes {

                return;

        ports[port_id].tx_ol_flags &= ~(TESTPMD_TX_OFFLOAD_INSERT_VLAN |

                               TESTPMD_TX_OFFLOAD_INSERT_QINQ);

+       ports[port_id].dev_conf.txmode.offloads &=

+                              ~(DEV_TX_OFFLOAD_VLAN_INSERT |

+                                DEV_TX_OFFLOAD_QINQ_INSERT);

        ports[port_id].tx_vlan_id = 0;

        ports[port_id].tx_vlan_id_outer = 0;

 }

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

index 77154ef..0087438 100644

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

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

@@ -1498,6 +1498,9 @@ static int eth_event_callback(portid_t port_id,

                }

                if (port->need_reconfig_queues > 0) {

                        port->need_reconfig_queues = 0;

+                       port->tx_conf.txq_flags = ETH_TXQ_FLAGS_IGNORE;

+                       /* Apply Tx offloads configuration */

+                       port->tx_conf.offloads = port->dev_conf.txmode.offloads;

FAST_FREE flag got lost during conversion.

Per-queue configuration flags are initialized with PMD-specific default values in rxtx_port_config:

rxtx_port_config(struct rte_port *port)
{
    port->rx_conf = port->dev_info.default_rxconf;
    port->tx_conf = port->dev_info.default_txconf;
...

but port->dev_conf.txmode is taken from global variable txmode, not from PMD. See in init_config():

        /* Apply default Tx configuration for all ports */
        port->dev_conf.txmode = tx_mode;
        port->dev_conf.rxmode = rx_mode;

So the configuration will not be consistent, i.e. different flags in tx_queue_setup() and different in dev_configure().

If the intention is to keep defaults from PMD, let's fix this...
If not, please apply FAST_FREE flag  as in example patch v3, e.g:

+        rte_eth_dev_info_get(portid, &dev_info);
+        if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MBUF_FAST_FREE)
+            local_port_conf.txmode.offloads |=
+                DEV_TX_OFFLOAD_MBUF_FAST_FREE;





                        /* setup tx queues */

                        for (qi = 0; qi < nb_txq; qi++) {

                               if ((numa_support) &&
  

Patch

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index d8c73a9..5812583 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -3439,7 +3439,14 @@  struct cmd_tx_vlan_set_result {
 {
 	struct cmd_tx_vlan_set_result *res = parsed_result;
 
+	if (!port_is_stopped(res->port_id)) {
+		printf("Please stop port %d first\n", res->port_id);
+		return;
+	}
+
 	tx_vlan_set(res->port_id, res->vlan_id);
+
+	cmd_reconfig_device_queue(res->port_id, 1, 1);
 }
 
 cmdline_parse_token_string_t cmd_tx_vlan_set_tx_vlan =
@@ -3486,7 +3493,14 @@  struct cmd_tx_vlan_set_qinq_result {
 {
 	struct cmd_tx_vlan_set_qinq_result *res = parsed_result;
 
+	if (!port_is_stopped(res->port_id)) {
+		printf("Please stop port %d first\n", res->port_id);
+		return;
+	}
+
 	tx_qinq_set(res->port_id, res->vlan_id, res->vlan_id_outer);
+
+	cmd_reconfig_device_queue(res->port_id, 1, 1);
 }
 
 cmdline_parse_token_string_t cmd_tx_vlan_set_qinq_tx_vlan =
@@ -3592,7 +3606,14 @@  struct cmd_tx_vlan_reset_result {
 {
 	struct cmd_tx_vlan_reset_result *res = parsed_result;
 
+	if (!port_is_stopped(res->port_id)) {
+		printf("Please stop port %d first\n", res->port_id);
+		return;
+	}
+
 	tx_vlan_reset(res->port_id);
+
+	cmd_reconfig_device_queue(res->port_id, 1, 1);
 }
 
 cmdline_parse_token_string_t cmd_tx_vlan_reset_tx_vlan =
@@ -3685,11 +3706,16 @@  struct cmd_csum_result {
 	struct cmd_csum_result *res = parsed_result;
 	int hw = 0;
 	uint16_t mask = 0;
+	uint64_t csum_offloads = 0;
 
 	if (port_id_is_invalid(res->port_id, ENABLED_WARN)) {
 		printf("invalid port %d\n", res->port_id);
 		return;
 	}
+	if (!port_is_stopped(res->port_id)) {
+		printf("Please stop port %d first\n", res->port_id);
+		return;
+	}
 
 	if (!strcmp(res->mode, "set")) {
 
@@ -3698,22 +3724,34 @@  struct cmd_csum_result {
 
 		if (!strcmp(res->proto, "ip")) {
 			mask = TESTPMD_TX_OFFLOAD_IP_CKSUM;
+			csum_offloads |= DEV_TX_OFFLOAD_IPV4_CKSUM;
 		} else if (!strcmp(res->proto, "udp")) {
 			mask = TESTPMD_TX_OFFLOAD_UDP_CKSUM;
+			csum_offloads |= DEV_TX_OFFLOAD_UDP_CKSUM;
 		} else if (!strcmp(res->proto, "tcp")) {
 			mask = TESTPMD_TX_OFFLOAD_TCP_CKSUM;
+			csum_offloads |= DEV_TX_OFFLOAD_TCP_CKSUM;
 		} else if (!strcmp(res->proto, "sctp")) {
 			mask = TESTPMD_TX_OFFLOAD_SCTP_CKSUM;
+			csum_offloads |= DEV_TX_OFFLOAD_SCTP_CKSUM;
 		} else if (!strcmp(res->proto, "outer-ip")) {
 			mask = TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM;
+			csum_offloads |= DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM;
 		}
 
-		if (hw)
+		if (hw) {
 			ports[res->port_id].tx_ol_flags |= mask;
-		else
+			ports[res->port_id].dev_conf.txmode.offloads |=
+							csum_offloads;
+		} else {
 			ports[res->port_id].tx_ol_flags &= (~mask);
+			ports[res->port_id].dev_conf.txmode.offloads &=
+							(~csum_offloads);
+		}
 	}
 	csum_show(res->port_id);
+
+	cmd_reconfig_device_queue(res->port_id, 1, 1);
 }
 
 cmdline_parse_token_string_t cmd_csum_csum =
@@ -3837,15 +3875,24 @@  struct cmd_tso_set_result {
 
 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
 		return;
+	if (!port_is_stopped(res->port_id)) {
+		printf("Please stop port %d first\n", res->port_id);
+		return;
+	}
 
 	if (!strcmp(res->mode, "set"))
 		ports[res->port_id].tso_segsz = res->tso_segsz;
 
-	if (ports[res->port_id].tso_segsz == 0)
+	if (ports[res->port_id].tso_segsz == 0) {
+		ports[res->port_id].dev_conf.txmode.offloads &=
+						~DEV_TX_OFFLOAD_TCP_TSO;
 		printf("TSO for non-tunneled packets is disabled\n");
-	else
+	} else {
+		ports[res->port_id].dev_conf.txmode.offloads |=
+						DEV_TX_OFFLOAD_TCP_TSO;
 		printf("TSO segment size for non-tunneled packets is %d\n",
 			ports[res->port_id].tso_segsz);
+	}
 
 	/* display warnings if configuration is not supported by the NIC */
 	rte_eth_dev_info_get(res->port_id, &dev_info);
@@ -3854,6 +3901,8 @@  struct cmd_tso_set_result {
 		printf("Warning: TSO enabled but not "
 			"supported by port %d\n", res->port_id);
 	}
+
+	cmd_reconfig_device_queue(res->port_id, 1, 1);
 }
 
 cmdline_parse_token_string_t cmd_tso_set_tso =
@@ -3939,13 +3988,27 @@  struct cmd_tunnel_tso_set_result {
 
 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
 		return;
+	if (!port_is_stopped(res->port_id)) {
+		printf("Please stop port %d first\n", res->port_id);
+		return;
+	}
 
 	if (!strcmp(res->mode, "set"))
 		ports[res->port_id].tunnel_tso_segsz = res->tso_segsz;
 
-	if (ports[res->port_id].tunnel_tso_segsz == 0)
+	if (ports[res->port_id].tunnel_tso_segsz == 0) {
+		ports[res->port_id].dev_conf.txmode.offloads &=
+			~(DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
+			  DEV_TX_OFFLOAD_GRE_TNL_TSO |
+			  DEV_TX_OFFLOAD_IPIP_TNL_TSO |
+			  DEV_TX_OFFLOAD_GENEVE_TNL_TSO);
 		printf("TSO for tunneled packets is disabled\n");
-	else {
+	} else {
+		ports[res->port_id].dev_conf.txmode.offloads |=
+			(DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
+			 DEV_TX_OFFLOAD_GRE_TNL_TSO |
+			 DEV_TX_OFFLOAD_IPIP_TNL_TSO |
+			 DEV_TX_OFFLOAD_GENEVE_TNL_TSO);
 		printf("TSO segment size for tunneled packets is %d\n",
 			ports[res->port_id].tunnel_tso_segsz);
 
@@ -3971,6 +4034,8 @@  struct cmd_tunnel_tso_set_result {
 			printf("Warning: csum set outer-ip must be set to hw "
 				"if outer L3 is IPv4; not necessary for IPv6\n");
 	}
+
+	cmd_reconfig_device_queue(res->port_id, 1, 1);
 }
 
 cmdline_parse_token_string_t cmd_tunnel_tso_set_tso =
@@ -13012,8 +13077,13 @@  struct cmd_macsec_offload_on_result {
 
 	if (port_id_is_invalid(port_id, ENABLED_WARN))
 		return;
+	if (!port_is_stopped(port_id)) {
+		printf("Please stop port %d first\n", port_id);
+		return;
+	}
 
 	ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_MACSEC;
+	ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_MACSEC_INSERT;
 #ifdef RTE_LIBRTE_IXGBE_PMD
 	ret = rte_pmd_ixgbe_macsec_enable(port_id, en, rp);
 #endif
@@ -13022,6 +13092,7 @@  struct cmd_macsec_offload_on_result {
 
 	switch (ret) {
 	case 0:
+		cmd_reconfig_device_queue(port_id, 1, 1);
 		break;
 	case -ENODEV:
 		printf("invalid port_id %d\n", port_id);
@@ -13096,14 +13167,21 @@  struct cmd_macsec_offload_off_result {
 
 	if (port_id_is_invalid(port_id, ENABLED_WARN))
 		return;
+	if (!port_is_stopped(port_id)) {
+		printf("Please stop port %d first\n", port_id);
+		return;
+	}
 
 	ports[port_id].tx_ol_flags &= ~TESTPMD_TX_OFFLOAD_MACSEC;
+	ports[port_id].dev_conf.txmode.offloads &=
+					~DEV_TX_OFFLOAD_MACSEC_INSERT;
 #ifdef RTE_LIBRTE_IXGBE_PMD
 	ret = rte_pmd_ixgbe_macsec_disable(port_id);
 #endif
 
 	switch (ret) {
 	case 0:
+		cmd_reconfig_device_queue(port_id, 1, 1);
 		break;
 	case -ENODEV:
 		printf("invalid port_id %d\n", port_id);
diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index 2fdc051..ee7d083 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -616,8 +616,8 @@  struct rss_type_info {
 
 	if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VLAN_INSERT) {
 		printf("VLAN insert:                   ");
-		if (ports[port_id].tx_ol_flags &
-		    TESTPMD_TX_OFFLOAD_INSERT_VLAN)
+		if (ports[port_id].dev_conf.txmode.offloads &
+		    DEV_TX_OFFLOAD_VLAN_INSERT)
 			printf("on\n");
 		else
 			printf("off\n");
@@ -634,8 +634,8 @@  struct rss_type_info {
 
 	if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_QINQ_INSERT) {
 		printf("Double VLANs insert:           ");
-		if (ports[port_id].tx_ol_flags &
-		    TESTPMD_TX_OFFLOAD_INSERT_QINQ)
+		if (ports[port_id].dev_conf.txmode.offloads &
+		    DEV_TX_OFFLOAD_QINQ_INSERT)
 			printf("on\n");
 		else
 			printf("off\n");
@@ -643,7 +643,8 @@  struct rss_type_info {
 
 	if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_IPV4_CKSUM) {
 		printf("TX IPv4 checksum:              ");
-		if (ports[port_id].tx_ol_flags & TESTPMD_TX_OFFLOAD_IP_CKSUM)
+		if (ports[port_id].dev_conf.txmode.offloads &
+		    DEV_TX_OFFLOAD_IPV4_CKSUM)
 			printf("on\n");
 		else
 			printf("off\n");
@@ -651,7 +652,8 @@  struct rss_type_info {
 
 	if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_UDP_CKSUM) {
 		printf("TX UDP checksum:               ");
-		if (ports[port_id].tx_ol_flags & TESTPMD_TX_OFFLOAD_UDP_CKSUM)
+		if (ports[port_id].dev_conf.txmode.offloads &
+		    DEV_TX_OFFLOAD_UDP_CKSUM)
 			printf("on\n");
 		else
 			printf("off\n");
@@ -659,7 +661,8 @@  struct rss_type_info {
 
 	if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_CKSUM) {
 		printf("TX TCP checksum:               ");
-		if (ports[port_id].tx_ol_flags & TESTPMD_TX_OFFLOAD_TCP_CKSUM)
+		if (ports[port_id].dev_conf.txmode.offloads &
+		    DEV_TX_OFFLOAD_TCP_CKSUM)
 			printf("on\n");
 		else
 			printf("off\n");
@@ -667,7 +670,8 @@  struct rss_type_info {
 
 	if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_SCTP_CKSUM) {
 		printf("TX SCTP checksum:              ");
-		if (ports[port_id].tx_ol_flags & TESTPMD_TX_OFFLOAD_SCTP_CKSUM)
+		if (ports[port_id].dev_conf.txmode.offloads &
+		    DEV_TX_OFFLOAD_SCTP_CKSUM)
 			printf("on\n");
 		else
 			printf("off\n");
@@ -675,8 +679,8 @@  struct rss_type_info {
 
 	if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) {
 		printf("TX Outer IPv4 checksum:        ");
-		if (ports[port_id].tx_ol_flags &
-		    TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM)
+		if (ports[port_id].dev_conf.txmode.offloads &
+		    DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM)
 			printf("on\n");
 		else
 			printf("off\n");
@@ -684,7 +688,8 @@  struct rss_type_info {
 
 	if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_TSO) {
 		printf("TX TCP segmentation:           ");
-		if (ports[port_id].tso_segsz != 0)
+		if (ports[port_id].dev_conf.txmode.offloads &
+		    DEV_TX_OFFLOAD_TCP_TSO)
 			printf("on\n");
 		else
 			printf("off\n");
@@ -692,7 +697,8 @@  struct rss_type_info {
 
 	if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_UDP_TSO) {
 		printf("TX UDP segmentation:           ");
-		if (ports[port_id].tso_segsz != 0)
+		if (ports[port_id].dev_conf.txmode.offloads &
+		    DEV_TX_OFFLOAD_UDP_TSO)
 			printf("on\n");
 		else
 			printf("off\n");
@@ -700,7 +706,8 @@  struct rss_type_info {
 
 	if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VXLAN_TNL_TSO) {
 		printf("TSO for VXLAN tunnel packet:   ");
-		if (ports[port_id].tunnel_tso_segsz)
+		if (ports[port_id].dev_conf.txmode.offloads &
+		    DEV_TX_OFFLOAD_VXLAN_TNL_TSO)
 			printf("on\n");
 		else
 			printf("off\n");
@@ -708,7 +715,8 @@  struct rss_type_info {
 
 	if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_GRE_TNL_TSO) {
 		printf("TSO for GRE tunnel packet:     ");
-		if (ports[port_id].tunnel_tso_segsz)
+		if (ports[port_id].dev_conf.txmode.offloads &
+		    DEV_TX_OFFLOAD_GRE_TNL_TSO)
 			printf("on\n");
 		else
 			printf("off\n");
@@ -716,7 +724,8 @@  struct rss_type_info {
 
 	if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_IPIP_TNL_TSO) {
 		printf("TSO for IPIP tunnel packet:    ");
-		if (ports[port_id].tunnel_tso_segsz)
+		if (ports[port_id].dev_conf.txmode.offloads &
+		    DEV_TX_OFFLOAD_IPIP_TNL_TSO)
 			printf("on\n");
 		else
 			printf("off\n");
@@ -724,7 +733,8 @@  struct rss_type_info {
 
 	if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_GENEVE_TNL_TSO) {
 		printf("TSO for GENEVE tunnel packet:  ");
-		if (ports[port_id].tunnel_tso_segsz)
+		if (ports[port_id].dev_conf.txmode.offloads &
+		    DEV_TX_OFFLOAD_GENEVE_TNL_TSO)
 			printf("on\n");
 		else
 			printf("off\n");
@@ -1703,8 +1713,10 @@  struct igb_ring_desc_16_bytes {
 				tx_conf->tx_thresh.pthresh,
 				tx_conf->tx_thresh.hthresh,
 				tx_conf->tx_thresh.wthresh);
-		printf("  TX RS bit threshold=%d - TXQ flags=0x%"PRIx32"\n",
-				tx_conf->tx_rs_thresh, tx_conf->txq_flags);
+		printf("  TX RS bit threshold=%d - TXQ flags=0x%"PRIx32""
+		       " - TXQ offloads=0x%"PRIx64"\n",
+				tx_conf->tx_rs_thresh, tx_conf->txq_flags,
+				tx_conf->offloads);
 	}
 }
 
@@ -2782,6 +2794,7 @@  struct igb_ring_desc_16_bytes {
 tx_vlan_set(portid_t port_id, uint16_t vlan_id)
 {
 	int vlan_offload;
+
 	if (port_id_is_invalid(port_id, ENABLED_WARN))
 		return;
 	if (vlan_id_is_invalid(vlan_id))
@@ -2795,6 +2808,7 @@  struct igb_ring_desc_16_bytes {
 
 	tx_vlan_reset(port_id);
 	ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_INSERT_VLAN;
+	ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_VLAN_INSERT;
 	ports[port_id].tx_vlan_id = vlan_id;
 }
 
@@ -2802,6 +2816,7 @@  struct igb_ring_desc_16_bytes {
 tx_qinq_set(portid_t port_id, uint16_t vlan_id, uint16_t vlan_id_outer)
 {
 	int vlan_offload;
+
 	if (port_id_is_invalid(port_id, ENABLED_WARN))
 		return;
 	if (vlan_id_is_invalid(vlan_id))
@@ -2817,6 +2832,7 @@  struct igb_ring_desc_16_bytes {
 
 	tx_vlan_reset(port_id);
 	ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_INSERT_QINQ;
+	ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_QINQ_INSERT;
 	ports[port_id].tx_vlan_id = vlan_id;
 	ports[port_id].tx_vlan_id_outer = vlan_id_outer;
 }
@@ -2828,6 +2844,9 @@  struct igb_ring_desc_16_bytes {
 		return;
 	ports[port_id].tx_ol_flags &= ~(TESTPMD_TX_OFFLOAD_INSERT_VLAN |
 				TESTPMD_TX_OFFLOAD_INSERT_QINQ);
+	ports[port_id].dev_conf.txmode.offloads &=
+				~(DEV_TX_OFFLOAD_VLAN_INSERT |
+				  DEV_TX_OFFLOAD_QINQ_INSERT);
 	ports[port_id].tx_vlan_id = 0;
 	ports[port_id].tx_vlan_id_outer = 0;
 }
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 77154ef..0087438 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1498,6 +1498,9 @@  static int eth_event_callback(portid_t port_id,
 		}
 		if (port->need_reconfig_queues > 0) {
 			port->need_reconfig_queues = 0;
+			port->tx_conf.txq_flags = ETH_TXQ_FLAGS_IGNORE;
+			/* Apply Tx offloads configuration */
+			port->tx_conf.offloads = port->dev_conf.txmode.offloads;
 			/* setup tx queues */
 			for (qi = 0; qi < nb_txq; qi++) {
 				if ((numa_support) &&