Skip to content

Commit 687560d

Browse files
Amir Tzinkuba-moo
authored andcommitted
net/mlx5: Fix ECVF vports unload on shutdown flow
Fix shutdown flow UAF when a virtual function is created on the embedded chip (ECVF) of a BlueField device. In such case the vport acl ingress table is not properly destroyed. ECVF functionality is independent of ecpf_vport_exists capability and thus functions mlx5_eswitch_(enable|disable)_pf_vf_vports() should not test it when enabling/disabling ECVF vports. kernel log: [] refcount_t: underflow; use-after-free. [] WARNING: CPU: 3 PID: 1 at lib/refcount.c:28 refcount_warn_saturate+0x124/0x220 ---------------- [] Call trace: [] refcount_warn_saturate+0x124/0x220 [] tree_put_node+0x164/0x1e0 [mlx5_core] [] mlx5_destroy_flow_table+0x98/0x2c0 [mlx5_core] [] esw_acl_ingress_table_destroy+0x28/0x40 [mlx5_core] [] esw_acl_ingress_lgcy_cleanup+0x80/0xf4 [mlx5_core] [] esw_legacy_vport_acl_cleanup+0x44/0x60 [mlx5_core] [] esw_vport_cleanup+0x64/0x90 [mlx5_core] [] mlx5_esw_vport_disable+0xc0/0x1d0 [mlx5_core] [] mlx5_eswitch_unload_ec_vf_vports+0xcc/0x150 [mlx5_core] [] mlx5_eswitch_disable_sriov+0x198/0x2a0 [mlx5_core] [] mlx5_device_disable_sriov+0xb8/0x1e0 [mlx5_core] [] mlx5_sriov_detach+0x40/0x50 [mlx5_core] [] mlx5_unload+0x40/0xc4 [mlx5_core] [] mlx5_unload_one_devl_locked+0x6c/0xe4 [mlx5_core] [] mlx5_unload_one+0x3c/0x60 [mlx5_core] [] shutdown+0x7c/0xa4 [mlx5_core] [] pci_device_shutdown+0x3c/0xa0 [] device_shutdown+0x170/0x340 [] __do_sys_reboot+0x1f4/0x2a0 [] __arm64_sys_reboot+0x2c/0x40 [] invoke_syscall+0x78/0x100 [] el0_svc_common.constprop.0+0x54/0x184 [] do_el0_svc+0x30/0xac [] el0_svc+0x48/0x160 [] el0t_64_sync_handler+0xa4/0x12c [] el0t_64_sync+0x1a4/0x1a8 [] --[ end trace 9c4601d68c70030e ]--- Fixes: a7719b2 ("net/mlx5: Add management of EC VF vports") Reviewed-by: Daniel Jurgens <[email protected]> Reviewed-by: Moshe Shemesh <[email protected]> Signed-off-by: Amir Tzin <[email protected]> Signed-off-by: Mark Bloch <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent f372581 commit 687560d

File tree

1 file changed

+13
-8
lines changed
  • drivers/net/ethernet/mellanox/mlx5/core

1 file changed

+13
-8
lines changed

drivers/net/ethernet/mellanox/mlx5/core/eswitch.c

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1295,12 +1295,15 @@ mlx5_eswitch_enable_pf_vf_vports(struct mlx5_eswitch *esw,
12951295
ret = mlx5_eswitch_load_pf_vf_vport(esw, MLX5_VPORT_ECPF, enabled_events);
12961296
if (ret)
12971297
goto ecpf_err;
1298-
if (mlx5_core_ec_sriov_enabled(esw->dev)) {
1299-
ret = mlx5_eswitch_load_ec_vf_vports(esw, esw->esw_funcs.num_ec_vfs,
1300-
enabled_events);
1301-
if (ret)
1302-
goto ec_vf_err;
1303-
}
1298+
}
1299+
1300+
/* Enable ECVF vports */
1301+
if (mlx5_core_ec_sriov_enabled(esw->dev)) {
1302+
ret = mlx5_eswitch_load_ec_vf_vports(esw,
1303+
esw->esw_funcs.num_ec_vfs,
1304+
enabled_events);
1305+
if (ret)
1306+
goto ec_vf_err;
13041307
}
13051308

13061309
/* Enable VF vports */
@@ -1331,9 +1334,11 @@ void mlx5_eswitch_disable_pf_vf_vports(struct mlx5_eswitch *esw)
13311334
{
13321335
mlx5_eswitch_unload_vf_vports(esw, esw->esw_funcs.num_vfs);
13331336

1337+
if (mlx5_core_ec_sriov_enabled(esw->dev))
1338+
mlx5_eswitch_unload_ec_vf_vports(esw,
1339+
esw->esw_funcs.num_ec_vfs);
1340+
13341341
if (mlx5_ecpf_vport_exists(esw->dev)) {
1335-
if (mlx5_core_ec_sriov_enabled(esw->dev))
1336-
mlx5_eswitch_unload_ec_vf_vports(esw, esw->esw_funcs.num_vfs);
13371342
mlx5_eswitch_unload_pf_vf_vport(esw, MLX5_VPORT_ECPF);
13381343
}
13391344

0 commit comments

Comments
 (0)