From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 7AFF7A0A02; Tue, 27 Apr 2021 16:11:04 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 3F8BB4124C; Tue, 27 Apr 2021 16:11:04 +0200 (CEST) Received: from szxga05-in.huawei.com (szxga05-in.huawei.com [45.249.212.191]) by mails.dpdk.org (Postfix) with ESMTP id 1478541243 for ; Tue, 27 Apr 2021 16:11:02 +0200 (CEST) Received: from DGGEMS403-HUB.china.huawei.com (unknown [172.30.72.59]) by szxga05-in.huawei.com (SkyGuard) with ESMTP id 4FV3WC2PqtzPtBp for ; Tue, 27 Apr 2021 22:07:51 +0800 (CST) Received: from [10.66.74.184] (10.66.74.184) by DGGEMS403-HUB.china.huawei.com (10.3.19.203) with Microsoft SMTP Server id 14.3.498.0; Tue, 27 Apr 2021 22:10:52 +0800 To: "Li, Xiaoyun" , "dev@dpdk.org" CC: "Yigit, Ferruh" References: <1614939741-63927-1-git-send-email-oulijun@huawei.com> <1618909266-17584-1-git-send-email-lihuisong@huawei.com> <1618909266-17584-4-git-send-email-lihuisong@huawei.com> From: Huisong Li Message-ID: <3efb36c1-3af7-7400-afcc-61970f9e0cac@huawei.com> Date: Tue, 27 Apr 2021 22:10:52 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Thunderbird/78.8.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 8bit X-Originating-IP: [10.66.74.184] X-CFilter-Loop: Reflected Subject: Re: [dpdk-dev] [PATCH V3 3/7] app/testpmd: fix a segment fault when DCB test X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" 在 2021/4/27 19:19, Li, Xiaoyun 写道: > >> -----Original Message----- >> From: Huisong Li >> Sent: Tuesday, April 20, 2021 17:01 >> To: dev@dpdk.org >> Cc: Yigit, Ferruh ; Li, Xiaoyun ; >> linuxarm@openeuler.org; lihuisong@huawei.com >> Subject: [PATCH V3 3/7] app/testpmd: fix a segment fault when DCB test >> >> 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 >> Signed-off-by: Lijun Ou >> --- >> app/test-pmd/config.c | 26 ++++++++++++++++++++++++++ >> 1 file changed, 26 insertions(+) >> >> diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c index >> 03ee40c..18b197b 100644 >> --- a/app/test-pmd/config.c >> +++ b/app/test-pmd/config.c >> @@ -2996,7 +2996,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 > When the port is RTE_PORT_STARTED or RTE_PORT_STARTED? Missing an 'or' here. ok > Maybe something like the following will be better? (just a reference, you can put it in a better way) > /* > * 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 configuring queue number needs to stop ports first. > */ Thank you😁 I'm going to fix it as follows:     /*      * 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 when      * 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.      */ >> + * RTE_PORT_STOPPED. When a port is RTE_PORT_STARTED, >> dev_configure >> + * cannot be called. >> + * >> + * re-configure the device after changing queue numbers of stopped >> + * ports, so that the updated mapping between tc and queue can be >> + * obtained. >> + */ >> + 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; >> -- >> 2.7.4 > .