在 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.
+ }
stream_init(fwd_streams[i]);
+ }
+ }
port_fwd_begin = cur_fwd_config.fwd_eng->port_fwd_begin;
if (port_fwd_begin != NULL) {