net/mlx5e: Move to use common phys port names for vport representors [Linux 5.0]

net/mlx5e: Move to use common phys port names for vport representors [Linux 5.0]

This Linux kernel change "net/mlx5e: Move to use common phys port names for vport representors" is included in the Linux 5.0 release. This change is authored by Or Gerlitz <ogerlitz [at]> on Wed Apr 25 17:32:04 2018 +0300. The commit for this change in Linux stable tree is c12ecc2 (patch).

net/mlx5e: Move to use common phys port names for vport representors

With VF LAG commit 491c37e49b48 "net/mlx5e: In case of LAG, one switch
parent id is used for all representors", both uplinks and all the VFs
(on both of them) get the same switchdev id.

This cause the provisioning system method to identify the rep of a given
VF from the parent PF PCI device using switchev id and physical port
name to break, since VFm of PF0 will have the (id, name) as VFm of PF1.

To fix that, we align to use the framework agreed upstream and set by
nfp commit 168c478e107e "nfp: wire get_phys_port_name on representors":

$ cat /sys/class/net/eth4_*/phys_port_name

Now, the names will be different, e.g. pf0vf0 vs. pf1vf0.

Fixes: 491c37e49b48 ("net/mlx5e: In case of LAG, one switch parent id is used for all representors")
Signed-off-by: Or Gerlitz <[email protected]>
Reported-by: Waleed Musa <[email protected]>
Reviewed-by: Roi Dayan <[email protected]>
Signed-off-by: Saeed Mahameed <[email protected]>

There are 35 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 drivers/net/ethernet/mellanox/mlx5/core/en_rep.c    | 12 ++++++++++--
 drivers/net/ethernet/mellanox/mlx5/core/lag.c       | 21 +++++++++++++++++++++
 drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h |  2 ++
 3 files changed, 33 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
index 0473621..f752272 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
@@ -1126,9 +1126,17 @@ static int mlx5e_rep_get_phys_port_name(struct net_device *dev,
    struct mlx5e_priv *priv = netdev_priv(dev);
    struct mlx5e_rep_priv *rpriv = priv->ppriv;
    struct mlx5_eswitch_rep *rep = rpriv->rep;
-   int ret;
+   int ret, pf_num;
+   ret = mlx5_lag_get_pf_num(priv->mdev, &pf_num);
+   if (ret)
+       return ret;
+   if (rep->vport == FDB_UPLINK_VPORT)
+       ret = snprintf(buf, len, "p%d", pf_num);
+   else
+       ret = snprintf(buf, len, "pf%dvf%d", pf_num, rep->vport - 1);

-   ret = snprintf(buf, len, "%d", rep->vport - 1);
    if (ret >= len)
        return -EOPNOTSUPP;

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/lag.c b/drivers/net/ethernet/mellanox/mlx5/core/lag.c
index 3a6baed..2d22338 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/lag.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/lag.c
@@ -616,6 +616,27 @@ void mlx5_lag_add(struct mlx5_core_dev *dev, struct net_device *netdev)

+int mlx5_lag_get_pf_num(struct mlx5_core_dev *dev, int *pf_num)
+   struct mlx5_lag *ldev;
+   int n;
+   ldev = mlx5_lag_dev_get(dev);
+   if (!ldev) {
+       mlx5_core_warn(dev, "no lag device, can't get pf num\n");
+       return -EINVAL;
+   }
+   for (n = 0; n < MLX5_MAX_PORTS; n++)
+       if (ldev->pf[n].dev == dev) {
+           *pf_num = n;
+           return 0;
+       }
+   mlx5_core_warn(dev, "wasn't able to locate pf in the lag device\n");
+   return -EINVAL;
 /* Must be called with intf_mutex held */
 void mlx5_lag_remove(struct mlx5_core_dev *dev)
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h b/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h
index c68dcea..5300b0b6 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h
@@ -187,6 +187,8 @@ static inline int mlx5_lag_is_lacp_owner(struct mlx5_core_dev *dev)
            MLX5_CAP_GEN(dev, lag_master);

+int mlx5_lag_get_pf_num(struct mlx5_core_dev *dev, int *pf_num);
 void mlx5_reload_interface(struct mlx5_core_dev *mdev, int protocol);
 void mlx5_lag_update(struct mlx5_core_dev *dev);

Leave a Reply

Your email address will not be published. Required fields are marked *