[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