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)
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; -- 2.27.0