app/testpmd: fix DCB re-configuration
authorHuisong Li <lihuisong@huawei.com>
Wed, 28 Apr 2021 06:40:42 +0000 (14:40 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Thu, 29 Apr 2021 16:10:14 +0000 (18:10 +0200)
After DCB mode is configured, if we decrease the number of RX and TX
queues, fwd_config_setup() will be called to setup the DCB forwarding
configuration. And forwarding streams are updated based on new queue
numbers in fwd_config_setup(), but the mapping between the TC and
queues obtained by rte_eth_dev_get_dcb_info() is still old queue
numbers (old queue numbers are greater than new queue numbers).
In this case, the segment fault happens. So rte_eth_dev_configure()
should be called again to update the mapping between the TC and
queues before rte_eth_dev_get_dcb_info().

Like:
set nbcore 4
port stop all
port config 0 dcb vt off 4 pfc on
port start all
port stop all
port config all rxq 8
port config all txq 8

Fixes: 900550de04a7 ("app/testpmd: add dcb support")
Cc: stable@dpdk.org
Signed-off-by: Huisong Li <lihuisong@huawei.com>
Signed-off-by: Lijun Ou <oulijun@huawei.com>
Acked-by: Xiaoyun Li <xiaoyun.li@intel.com>
app/test-pmd/config.c

index 39c0b80..bbf039d 100644 (file)
@@ -3043,7 +3043,33 @@ dcb_fwd_config_setup(void)
        uint16_t nb_rx_queue, nb_tx_queue;
        uint16_t i, j, k, sm_id = 0;
        uint16_t total_tc_num;
+       struct rte_port *port;
        uint8_t tc = 0;
+       portid_t pid;
+       int ret;
+
+       /*
+        * The fwd_config_setup() is called when the port is RTE_PORT_STARTED
+        * or RTE_PORT_STOPPED.
+        *
+        * Re-configure ports to get updated mapping between tc and queue in
+        * case the queue number of the port is changed. Skip for started ports
+        * since modifying queue number and calling dev_configure need to stop
+        * ports first.
+        */
+       for (pid = 0; pid < nb_fwd_ports; pid++) {
+               if (port_is_started(pid) == 1)
+                       continue;
+
+               port = &ports[pid];
+               ret = rte_eth_dev_configure(pid, nb_rxq, nb_txq,
+                                           &port->dev_conf);
+               if (ret < 0) {
+                       printf("Failed to re-configure port %d, ret = %d.\n",
+                               pid, ret);
+                       return;
+               }
+       }
 
        cur_fwd_config.nb_fwd_lcores = (lcoreid_t) nb_fwd_lcores;
        cur_fwd_config.nb_fwd_ports = nb_fwd_ports;