]> git.itanic.dy.fi Git - linux-stable/commitdiff
net/mlx5: LAG, check if all eswitches are paired for shared FDB
authorShay Drory <shayd@nvidia.com>
Tue, 6 Jun 2023 07:12:07 +0000 (00:12 -0700)
committerSaeed Mahameed <saeedm@nvidia.com>
Wed, 7 Jun 2023 21:00:42 +0000 (14:00 -0700)
Shared FDB LAG can only work if all eswitches are paired.
Also, whenever two eswitches are paired, devcom is marked as ready.

Therefore, in case of device with two eswitches, checking devcom was
sufficient. However, this is not correct for device with more than
two eswitches, which will be introduced in downstream patch.
Hence, check all eswitches are paired explicitly.

Signed-off-by: Shay Drory <shayd@nvidia.com>
Reviewed-by: Mark Bloch <mbloch@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
drivers/net/ethernet/mellanox/mlx5/core/lag/lag.c

index c42c16d9ccbc79efc23005cc21e33f4325de24f3..d3608f198e0af09d94de8bbce2b7611395a5fcb4 100644 (file)
@@ -779,6 +779,13 @@ static inline int mlx5_eswitch_num_vfs(struct mlx5_eswitch *esw)
        return 0;
 }
 
+static inline int mlx5_eswitch_get_npeers(struct mlx5_eswitch *esw)
+{
+       if (mlx5_esw_allowed(esw))
+               return esw->num_peers;
+       return 0;
+}
+
 static inline struct mlx5_flow_table *
 mlx5_eswitch_get_slow_fdb(struct mlx5_eswitch *esw)
 {
@@ -826,6 +833,8 @@ static inline void
 mlx5_eswitch_offloads_single_fdb_del_one(struct mlx5_eswitch *master_esw,
                                         struct mlx5_eswitch *slave_esw) {}
 
+static inline int mlx5_eswitch_get_npeers(struct mlx5_eswitch *esw) { return 0; }
+
 static inline int
 mlx5_eswitch_reload_reps(struct mlx5_eswitch *esw)
 {
index c55e36e0571d18a95c2c70d64c3793d80312b7fb..dd8a19d856178b9a34d6e63169c0e8fde92e85fc 100644 (file)
@@ -828,7 +828,9 @@ bool mlx5_shared_fdb_supported(struct mlx5_lag *ldev)
                                      MLX5_DEVCOM_ESW_OFFLOADS) &&
            MLX5_CAP_GEN(dev1, lag_native_fdb_selection) &&
            MLX5_CAP_ESW(dev1, root_ft_on_other_esw) &&
-           MLX5_CAP_ESW(dev0, esw_shared_ingress_acl))
+           MLX5_CAP_ESW(dev0, esw_shared_ingress_acl) &&
+           mlx5_eswitch_get_npeers(dev0->priv.eswitch) == MLX5_CAP_GEN(dev0, num_lag_ports) - 1 &&
+           mlx5_eswitch_get_npeers(dev1->priv.eswitch) == MLX5_CAP_GEN(dev1, num_lag_ports) - 1)
                return true;
 
        return false;