]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net/mlx5: Fix peer miss rules host disabled checks
authorCarolina Jubran <cjubran@nvidia.com>
Thu, 5 Mar 2026 14:26:31 +0000 (16:26 +0200)
committerJakub Kicinski <kuba@kernel.org>
Sat, 7 Mar 2026 01:25:39 +0000 (17:25 -0800)
The check on mlx5_esw_host_functions_enabled(esw->dev) for adding VF
peer miss rules is incorrect. These rules match traffic from peer's VFs,
so the local device's host function status is irrelevant. Remove this
check to ensure peer VF traffic is properly handled regardless of local
host configuration.

Also fix the PF peer miss rule deletion to be symmetric with the add
path, so only attempt to delete the rule if it was actually created.

Fixes: 520369ef43a8 ("net/mlx5: Support disabling host PFs")
Signed-off-by: Carolina Jubran <cjubran@nvidia.com>
Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
Link: https://patch.msgid.link/20260305142634.1813208-3-tariqt@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c

index 8c5e48d001be039855bcb87b2f38a5d6e4994d75..7a9ee36b8dcaa3d77bfcf44e00e8d5d78a50285e 100644 (file)
@@ -1241,21 +1241,17 @@ static int esw_add_fdb_peer_miss_rules(struct mlx5_eswitch *esw,
                flows[peer_vport->index] = flow;
        }
 
-       if (mlx5_esw_host_functions_enabled(esw->dev)) {
-               mlx5_esw_for_each_vf_vport(peer_esw, i, peer_vport,
-                                          mlx5_core_max_vfs(peer_dev)) {
-                       esw_set_peer_miss_rule_source_port(esw, peer_esw,
-                                                          spec,
-                                                          peer_vport->vport);
-
-                       flow = mlx5_add_flow_rules(mlx5_eswitch_get_slow_fdb(esw),
-                                                  spec, &flow_act, &dest, 1);
-                       if (IS_ERR(flow)) {
-                               err = PTR_ERR(flow);
-                               goto add_vf_flow_err;
-                       }
-                       flows[peer_vport->index] = flow;
+       mlx5_esw_for_each_vf_vport(peer_esw, i, peer_vport,
+                                  mlx5_core_max_vfs(peer_dev)) {
+               esw_set_peer_miss_rule_source_port(esw, peer_esw, spec,
+                                                  peer_vport->vport);
+               flow = mlx5_add_flow_rules(mlx5_eswitch_get_slow_fdb(esw),
+                                          spec, &flow_act, &dest, 1);
+               if (IS_ERR(flow)) {
+                       err = PTR_ERR(flow);
+                       goto add_vf_flow_err;
                }
+               flows[peer_vport->index] = flow;
        }
 
        if (mlx5_core_ec_sriov_enabled(peer_dev)) {
@@ -1347,7 +1343,8 @@ static void esw_del_fdb_peer_miss_rules(struct mlx5_eswitch *esw,
                mlx5_del_flow_rules(flows[peer_vport->index]);
        }
 
-       if (mlx5_core_is_ecpf_esw_manager(peer_dev)) {
+       if (mlx5_core_is_ecpf_esw_manager(peer_dev) &&
+           mlx5_esw_host_functions_enabled(peer_dev)) {
                peer_vport = mlx5_eswitch_get_vport(peer_esw, MLX5_VPORT_PF);
                mlx5_del_flow_rules(flows[peer_vport->index]);
        }