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

Maciej Czekaj maciej.czekaj at caviumnetworks.com
Fri Jan 5 19:11:05 CET 2018



-- 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 at 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) &&



More information about the dev mailing list