[PATCH] app/testpmd: fix secondary process not forwarding

lihuisong (C) lihuisong at huawei.com
Tue Feb 21 07:37:44 CET 2023


在 2023/2/21 10:52, He, ShiyangX 写道:
>
>> -----Original Message-----
>> From: lihuisong (C) <lihuisong at huawei.com>
>> Sent: Monday, February 20, 2023 8:46 PM
>> To: He, ShiyangX <shiyangx.he at intel.com>; dev at dpdk.org
>> Cc: Zhou, YidingX <yidingx.zhou at intel.com>; stable at dpdk.org; Singh, Aman
>> Deep <aman.deep.singh at intel.com>; Zhang, Yuying
>> <yuying.zhang at intel.com>; Burakov, Anatoly <anatoly.burakov at intel.com>;
>> Li, Xiaoyun <xiaoyun.li at intel.com>; Alvin Zhang <alvinx.zhang at 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: stable at dpdk.org
>>>
>>> Signed-off-by: Shiyang He <shiyangx.he at 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.
>>> +			}
>>>    			stream_init(fwd_streams[i]);
>>> +		}
>>> +	}
>>>
>>>    	port_fwd_begin = cur_fwd_config.fwd_eng->port_fwd_begin;
>>>    	if (port_fwd_begin != NULL) {


More information about the stable mailing list