在 2021/6/22 17:25, Martin Havlik 写道:
When dedicated queues are enabled, mlx5 PMD fails to install RTE Flows
if the underlying ethdev is not started:
bond_ethdev_8023ad_flow_set(267) - bond_ethdev_8023ad_flow_set: port not 
started (slave_port=0 queue_id=1)

Why mlx5 PMD doing flow create relys on port started ?
I noticed other PMDs did not has that reliance.

Signed-off-by: Martin Havlik <xhavl...@stud.fit.vutbr.cz>
Cc: Jan Viktorin <vikto...@cesnet.cz>
---
  drivers/net/bonding/rte_eth_bond_pmd.c | 26 ++++++++++++++++++--------
  1 file changed, 18 insertions(+), 8 deletions(-)

diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c 
b/drivers/net/bonding/rte_eth_bond_pmd.c
index a6755661c..fea3bc537 100644
--- a/drivers/net/bonding/rte_eth_bond_pmd.c
+++ b/drivers/net/bonding/rte_eth_bond_pmd.c
@@ -1818,25 +1818,35 @@ slave_configure(struct rte_eth_dev *bonded_eth_dev,
                        rte_flow_destroy(slave_eth_dev->data->port_id,
                                        
internals->mode4.dedicated_queues.flow[slave_eth_dev->data->port_id],
                                        &flow_error);
+       }
+ /* Start device */
+       errval = rte_eth_dev_start(slave_eth_dev->data->port_id);
+       if (errval != 0) {
+               RTE_BOND_LOG(ERR, "rte_eth_dev_start: port=%u, err (%d)",
+                               slave_eth_dev->data->port_id, errval);
+               return -1;
+       }
+
+       if (internals->mode == BONDING_MODE_8023AD &&
+                       internals->mode4.dedicated_queues.enabled == 1) {
                errval = bond_ethdev_8023ad_flow_set(bonded_eth_dev,
                                slave_eth_dev->data->port_id);
                if (errval != 0) {
                        RTE_BOND_LOG(ERR,
                                "bond_ethdev_8023ad_flow_set: port=%d, err 
(%d)",
                                slave_eth_dev->data->port_id, errval);
+
+                       errval = rte_eth_dev_stop(slave_eth_dev->data->port_id);
+                       if (errval < 0) {
+                               RTE_BOND_LOG(ERR,
+                                       "rte_eth_dev_stop: port=%d, err (%d)",
+                                       slave_eth_dev->data->port_id, errval);
+                       }
                        return errval;
                }
        }
- /* Start device */
-       errval = rte_eth_dev_start(slave_eth_dev->data->port_id);
-       if (errval != 0) {
-               RTE_BOND_LOG(ERR, "rte_eth_dev_start: port=%u, err (%d)",
-                               slave_eth_dev->data->port_id, errval);
-               return -1;
-       }
-
        /* If RSS is enabled for bonding, synchronize RETA */
        if (bonded_eth_dev->data->dev_conf.rxmode.mq_mode & ETH_MQ_RX_RSS) {
                int i;

Reply via email to