>-----Original Message----- >From: lihuisong (C) <lihuis...@huawei.com> >Sent: Tuesday, February 21, 2023 2:38 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 > > >在 2023/2/21 10:52, He, ShiyangX 写道: >> >>> -----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. >"all non-primary processes" is which processes? it's only 'secondary' >here, not 'auto', right? >> >>>> + 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. >The rx/tx_queue_start/stop() can change Rx/Tx queue state if PMD supports >this API. >In primary, if PMD doesn't support this API, this queue state do not be >changed and still be the original value(RTE_ETH_QUEUE_STATE_STARTED) >start_port() sets. >However, in secondary, Rx/Tx queue state have not been initialized, your >patch also do not it. >Namely, their default values are wrong. > >Our plan needs to ensure that the PMDs that do not support >rx/tx_queue_start/stop() or rx/tx_queue_info_get() can forward in >secondary. > >I think we either add the initialization of queue state in start_port() or >somewhere else, or make sure it's ok here.
Thanks for your comment, the v2 patch will be sent soon! >>>> + } >>>> stream_init(fwd_streams[i]); >>>> + } >>>> + } >>>> >>>> port_fwd_begin = cur_fwd_config.fwd_eng->port_fwd_begin; >>>> if (port_fwd_begin != NULL) {