]> git.droids-corp.org - dpdk.git/commitdiff
app/testpmd: fix RSS hash offload display
authorJie Wang <jie1x.wang@intel.com>
Thu, 14 Oct 2021 10:31:24 +0000 (18:31 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 15 Oct 2021 11:27:05 +0000 (13:27 +0200)
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 <jie1x.wang@intel.com>
Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>
app/test-pmd/cmdline.c
app/test-pmd/testpmd.c
app/test-pmd/testpmd.h
app/test-pmd/util.c

index 36d50fd3c7fa7d8c6641af04f5dd357d858e999f..b8f06063d2250182ab268de96fb27f2b6a9aee85 100644 (file)
@@ -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");
index a40fe1eef194395b3359905721a2d0703531dc6e..909b6571dc2613fbe72273e88a97fcee7d319fe4 100644 (file)
@@ -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);
index ea45c143896f3bbdbaa2bc184524303508579295..39f464f1ee167d32c14b3813f721d0ea75e66bc6 100644 (file)
@@ -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);
index 480cc1144aa3f79fe91f40734fe376cbf534516d..26dc0c86406589d047e17d37a47b2a8b95fd5028 100644 (file)
@@ -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)
 {