From: Jie Wang Date: Thu, 14 Oct 2021 10:31:24 +0000 (+0800) Subject: app/testpmd: fix RSS hash offload display X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=655eae01f9936936165854c69795f447c1756f74;p=dpdk.git app/testpmd: fix RSS hash offload display The driver may change RSS hash offloads in dev->data->dev_conf during dev_configure which may cause port->dev_conf and port->rx_conf contain outdated values. Since testpmd uses its configuration structures to display offloads configuration, it doesn't display RSS hash offload. This patch updates the testpmd offloads from device configuration to fix this issue. Fixes: ce8d561418d4 ("app/testpmd: add port configuration settings") Signed-off-by: Jie Wang Reviewed-by: Ferruh Yigit --- diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index 36d50fd3c7..b8f06063d2 100644 --- a/app/test-pmd/cmdline.c +++ b/app/test-pmd/cmdline.c @@ -16034,6 +16034,7 @@ cmd_rx_offload_get_configuration_parsed( struct rte_eth_dev_info dev_info; portid_t port_id = res->port_id; struct rte_port *port = &ports[port_id]; + struct rte_eth_conf dev_conf; uint64_t port_offloads; uint64_t queue_offloads; uint16_t nb_rx_queues; @@ -16042,7 +16043,11 @@ cmd_rx_offload_get_configuration_parsed( printf("Rx Offloading Configuration of port %d :\n", port_id); - port_offloads = port->dev_conf.rxmode.offloads; + ret = eth_dev_conf_get_print_err(port_id, &dev_conf); + if (ret != 0) + return; + + port_offloads = dev_conf.rxmode.offloads; printf(" Port :"); print_rx_offloads(port_offloads); printf("\n"); @@ -16448,6 +16453,7 @@ cmd_tx_offload_get_configuration_parsed( struct rte_eth_dev_info dev_info; portid_t port_id = res->port_id; struct rte_port *port = &ports[port_id]; + struct rte_eth_conf dev_conf; uint64_t port_offloads; uint64_t queue_offloads; uint16_t nb_tx_queues; @@ -16456,7 +16462,11 @@ cmd_tx_offload_get_configuration_parsed( printf("Tx Offloading Configuration of port %d :\n", port_id); - port_offloads = port->dev_conf.txmode.offloads; + ret = eth_dev_conf_get_print_err(port_id, &dev_conf); + if (ret != 0) + return; + + port_offloads = dev_conf.txmode.offloads; printf(" Port :"); print_tx_offloads(port_offloads); printf("\n"); diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index a40fe1eef1..909b6571dc 100644 --- a/app/test-pmd/testpmd.c +++ b/app/test-pmd/testpmd.c @@ -2711,6 +2711,9 @@ start_port(portid_t pid) } if (port->need_reconfig > 0) { + struct rte_eth_conf dev_conf; + int k; + port->need_reconfig = 0; if (flow_isolate_all) { @@ -2748,6 +2751,36 @@ start_port(portid_t pid) port->need_reconfig = 1; return -1; } + /* get device configuration*/ + if (0 != + eth_dev_conf_get_print_err(pi, &dev_conf)) { + fprintf(stderr, + "port %d can not get device configuration\n", + pi); + return -1; + } + /* Apply Rx offloads configuration */ + if (dev_conf.rxmode.offloads != + port->dev_conf.rxmode.offloads) { + port->dev_conf.rxmode.offloads |= + dev_conf.rxmode.offloads; + for (k = 0; + k < port->dev_info.max_rx_queues; + k++) + port->rx_conf[k].offloads |= + dev_conf.rxmode.offloads; + } + /* Apply Tx offloads configuration */ + if (dev_conf.txmode.offloads != + port->dev_conf.txmode.offloads) { + port->dev_conf.txmode.offloads |= + dev_conf.txmode.offloads; + for (k = 0; + k < port->dev_info.max_tx_queues; + k++) + port->tx_conf[k].offloads |= + dev_conf.txmode.offloads; + } } if (port->need_reconfig_queues > 0 && is_proc_primary()) { port->need_reconfig_queues = 0; @@ -3715,7 +3748,7 @@ init_port_config(void) { portid_t pid; struct rte_port *port; - int ret; + int ret, i; RTE_ETH_FOREACH_DEV(pid) { port = &ports[pid]; @@ -3735,12 +3768,21 @@ init_port_config(void) } if (port->dcb_flag == 0) { - if( port->dev_conf.rx_adv_conf.rss_conf.rss_hf != 0) + if (port->dev_conf.rx_adv_conf.rss_conf.rss_hf != 0) { port->dev_conf.rxmode.mq_mode = (enum rte_eth_rx_mq_mode) (rx_mq_mode & ETH_MQ_RX_RSS); - else + } else { port->dev_conf.rxmode.mq_mode = ETH_MQ_RX_NONE; + port->dev_conf.rxmode.offloads &= + ~DEV_RX_OFFLOAD_RSS_HASH; + + for (i = 0; + i < port->dev_info.nb_rx_queues; + i++) + port->rx_conf[i].offloads &= + ~DEV_RX_OFFLOAD_RSS_HASH; + } } rxtx_port_config(port); diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h index ea45c14389..39f464f1ee 100644 --- a/app/test-pmd/testpmd.h +++ b/app/test-pmd/testpmd.h @@ -979,6 +979,8 @@ void show_gro(portid_t port_id); void setup_gso(const char *mode, portid_t port_id); int eth_dev_info_get_print_err(uint16_t port_id, struct rte_eth_dev_info *dev_info); +int eth_dev_conf_get_print_err(uint16_t port_id, + struct rte_eth_conf *dev_conf); void eth_set_promisc_mode(uint16_t port_id, int enable); void eth_set_allmulticast_mode(uint16_t port, int enable); int eth_link_get_nowait_print_err(uint16_t port_id, struct rte_eth_link *link); diff --git a/app/test-pmd/util.c b/app/test-pmd/util.c index 480cc1144a..26dc0c8640 100644 --- a/app/test-pmd/util.c +++ b/app/test-pmd/util.c @@ -447,6 +447,20 @@ eth_dev_info_get_print_err(uint16_t port_id, return ret; } +int +eth_dev_conf_get_print_err(uint16_t port_id, struct rte_eth_conf *dev_conf) +{ + int ret; + + ret = rte_eth_dev_conf_get(port_id, dev_conf); + if (ret != 0) + fprintf(stderr, + "Error during getting device configuration (port %u): %s\n", + port_id, strerror(-ret)); + + return ret; +} + void eth_set_promisc_mode(uint16_t port, int enable) {