在 2023/7/3 19:02, Jie Hai 写道:
Function update_queue_state updates queue state of all queues
of all ports, using the queue num nb_rxq|nb_txq stored locally
by testpmd. Error on invalid queue ID occurs if we start testpmd
with two ports and detach-attach one of them and start the other
How do start the first port? start packet forwarding?
port first. That's because the attached port has zero queues and
that differs from the nb_rxq|nb_txq. The similar error happens
in multi-process senoris if secondary process attaches a port
and starts it.
This patch updates queue state according to the num of queues
reported by driver instead of testpmd.
Fixes: 141a520b35f7 ("app/testpmd: fix primary process not polling all queues")
Fixes: 5028f207a4fa ("app/testpmd: fix secondary process packet forwarding")
Cc: sta...@dpdk.org
Signed-off-by: Jie Hai <haij...@huawei.com>
---
app/test-pmd/testpmd.c | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 1fc70650e0a4..c8ce67d0de9f 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -2479,13 +2479,22 @@ update_tx_queue_state(uint16_t port_id, uint16_t
queue_id)
static void
update_queue_state(void)
{
+ struct rte_port *port;
+ uint16_t nb_rx_queues;
+ uint16_t nb_tx_queues;
portid_t pi;
queueid_t qi;
RTE_ETH_FOREACH_DEV(pi) {
- for (qi = 0; qi < nb_rxq; qi++)
+ port = &ports[pi];
+ if (eth_dev_info_get_print_err(pi, &port->dev_info) != 0)
+ continue;
Is this something to do for the dettach-attached port?
If so I don't think this is the root method.
Because the global ports[attached_port_id] isn't initialized, and the
attached port isn't started.
And the first port cannot be start to forward(start_packet_forwarding
will do check this).
Another possible reason is that the attached port status is incorrect.
Please take a look at the following patchset.
http://patches.dpdk.org/project/dpdk/list/?series=&submitter=2085&state=&q=&archive=&delegate=
+
+ nb_rx_queues = RTE_MIN(nb_rxq, port->dev_info.nb_rx_queues);
+ nb_tx_queues = RTE_MIN(nb_txq, port->dev_info.nb_tx_queues);
+ for (qi = 0; qi < nb_rx_queues; qi++)
update_rx_queue_state(pi, qi);
- for (qi = 0; qi < nb_txq; qi++)
+ for (qi = 0; qi < nb_tx_queues; qi++)
update_tx_queue_state(pi, qi);
}
}