net/mlx5: fix port domain_id initialization
PATCH 1/1 net/mlx5: fix port domain_id initialization
All active ports that belong to the same E-switch share domain_id value.
Port initialization procedure searches through a database for existing port with matching properties. New domain_id allocated if match was not located. Otherwise, new port inherits existing domain_id.
Port initialization did not pass enough info to search procedure to find existing matches. Therefore, each port was created with a private domain_id value. As the result, port_id flow action failed because it could not match ports in a rule to E-switch.
The patch adds dpdk_dev with port properties to device search.
--- drivers/net/mlx5/linux/mlx5_os.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
drivers/net/mlx5/linux/mlx5_os.c +12 -1
@@ -1181,6 +1181,13 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev, priv->vport_meta_tag =0 ; priv->vport_meta_mask =0 ; priv->pf_bond = spawn->pf_bond; + +DRV_LOG (DEBUG , +"dev_port=%u bus=%s pci=%s master=%d representor=%d pf_bond=%d\n" , + priv->dev_port, dpdk_dev->bus->name, + priv->pci_dev ? priv->pci_dev->name :"NONE" , + priv->master, priv->representor, priv->pf_bond); +/* * If we have E-Switch we should determine the vport attributes. * E-Switch may use either source vport field or reg_c[0] metadata
@@ -1253,7 +1260,7 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev,* Look for sibling devices in order to reuse their switch domain * if any, otherwise allocate one. */ - MLX5_ETH_FOREACH_DEV(port_id, NULL) { + MLX5_ETH_FOREACH_DEV(port_id, dpdk_dev) {const struct mlx5_priv *opriv = rte_eth_devices[port_id].data->dev_private;
@@ -1263,6 +1270,8 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev, RTE_ETH_DEV_SWITCH_DOMAIN_ID_INVALID)continue ; priv->domain_id = opriv->domain_id; +DRV_LOG (DEBUG ,"dev_port-%u inherit domain_id=%u\n" , + priv->dev_port, priv->domain_id);break ; }if (priv->domain_id ==RTE_ETH_DEV_SWITCH_DOMAIN_ID_INVALID ) {
@@ -1274,6 +1283,8 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev, goto error; } own_domain_id =1 ; +DRV_LOG (DEBUG ,"dev_port-%u new domain_id=%u\n" , + priv->dev_port, priv->domain_id); }/* Override some values set by hardware configuration. */ mlx5_args (config, dpdk_dev->devargs);
Signature · 1 line
2.32.0
Thomas Monjalon
AppliedTitle proposal:
net/mlx5: fix port initialization of switch domain
02/08/2021 16:55, Gregory Etelson:
Quoted 11 lines
All active ports that belong to the same E-switch share
domain_idvalue.
Port initialization procedure searches through a database for existing port with matching properties. Newdomain_idallocated if match was not located. Otherwise, new port inherits existingdomain_id.Port initialization did not pass enough info to search procedure to find existing matches. Therefore, each port was created with a private
domain_idvalue. As the result,port_idflow action failed because it could not match ports in a rule to E-switch.
Quoted 6 lines
The patch adds
dpdk_devwith port properties to device search.Fixes 56bb3c84e982 ("net/mlx5: reduce PCI dependency")Signed-off-by Gregory Etelson <[email protected]>
Applied, thanks.