>-----Original Message----- >From: lihuisong (C) <lihuis...@huawei.com> >Sent: Monday, February 20, 2023 8:46 PM >To: He, ShiyangX <shiyangx...@intel.com>; dev@dpdk.org >Cc: Zhou, YidingX <yidingx.z...@intel.com>; sta...@dpdk.org; Singh, Aman >Deep <aman.deep.si...@intel.com>; Zhang, Yuying ><yuying.zh...@intel.com>; Burakov, Anatoly <anatoly.bura...@intel.com>; >Li, Xiaoyun <xiaoyun...@intel.com>; Alvin Zhang <alvinx.zh...@intel.com> >Subject: Re: [PATCH] app/testpmd: fix secondary process not forwarding > > >在 2022/12/30 15:55, Shiyang He 写道: >> Under multi-process scenario, the secondary process gets queue state >> from the wrong location (the global variable 'ports'). Therefore, the >> secondary process can not forward since "stream_init" is not called. >> >> This commit fixes the issue by calling 'rte_eth_rx/tx_queue_info_get' >> to get queue state from shared memory. >> >> Fixes: a78040c990cb ("app/testpmd: update forward engine beginning") >should use this commit: >Fixes: 3c4426db54fc ("app/testpmd: do not poll stopped queues")
Thanks for your comments, I will ask maintainer to help fix this problem. >> Cc: sta...@dpdk.org >> >> Signed-off-by: Shiyang He <shiyangx...@intel.com> >> --- >> app/test-pmd/testpmd.c | 29 +++++++++++++++++++++++++++-- >> 1 file changed, 27 insertions(+), 2 deletions(-) >> >> diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index >> 134d79a555..2c73daf9eb 100644 >> --- a/app/test-pmd/testpmd.c >> +++ b/app/test-pmd/testpmd.c >> @@ -2378,9 +2378,34 @@ start_packet_forwarding(int with_tx_first) >> if (!pkt_fwd_shared_rxq_check()) >> return; >> >> - if (stream_init != NULL) >> - for (i = 0; i < cur_fwd_config.nb_fwd_streams; i++) >> + if (stream_init != NULL) { >> + for (i = 0; i < cur_fwd_config.nb_fwd_streams; i++) { >> + if (rte_eal_process_type() != RTE_PROC_PRIMARY) { > >directly use "rte_eal_process_type() == RTE_PROC_SECONDARY"? The following action should be executed for all non-primary processes. > >> + struct fwd_stream *fs = fwd_streams[i]; >> + struct rte_eth_rxq_info rx_qinfo; >> + struct rte_eth_txq_info tx_qinfo; >> + int32_t rc; >> + rc = rte_eth_rx_queue_info_get(fs->rx_port, >> + fs->rx_queue, &rx_qinfo); >> + if (!rc) >> + ports[fs->rx_port].rxq[fs- >>rx_queue].state = >> + rx_qinfo.queue_state; >> + else >> + TESTPMD_LOG(WARNING, >> + "Failed to get rx queue >info\n"); >> + >> + rc = rte_eth_tx_queue_info_get(fs->tx_port, >> + fs->tx_queue, &tx_qinfo); >> + if (!rc) >> + ports[fs->tx_port].txq[fs- >>tx_queue].state = >> + tx_qinfo.queue_state; >> + else >> + TESTPMD_LOG(WARNING, >> + "Failed to get tx queue >info\n"); >not all PMDs implement rte_eth_rx/tx_queue_info_get() to query the state, >right? >Can you set this state to 'START' if the return value is '-ENOTSUP'? If pmd doesn't implement "rte_eth_rx/tx_queue_info_get()" to query queue state, should use the default value instead of modifying the state, because it may be modified elsewhere. >> + } >> stream_init(fwd_streams[i]); >> + } >> + } >> >> port_fwd_begin = cur_fwd_config.fwd_eng->port_fwd_begin; >> if (port_fwd_begin != NULL) {