]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net/mlx5: Fix ECVF vports unload on shutdown flow
authorAmir Tzin <amirtz@nvidia.com>
Tue, 10 Jun 2025 15:15:07 +0000 (18:15 +0300)
committerJakub Kicinski <kuba@kernel.org>
Wed, 11 Jun 2025 21:41:08 +0000 (14:41 -0700)
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: a7719b29a821 ("net/mlx5: Add management of EC VF vports")
Reviewed-by: Daniel Jurgens <danielj@nvidia.com>
Reviewed-by: Moshe Shemesh <moshe@nvidia.com>
Signed-off-by: Amir Tzin <amirtz@nvidia.com>
Signed-off-by: Mark Bloch <mbloch@nvidia.com>
Link: https://patch.msgid.link/20250610151514.1094735-3-mbloch@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/eswitch.c

index 7fb8a3381f849e63b33bd9a8510f1e65d109b5ce..4917d185d0c352ceba9b94095dc8f8b5954f0a8c 100644 (file)
@@ -1295,12 +1295,15 @@ mlx5_eswitch_enable_pf_vf_vports(struct mlx5_eswitch *esw,
                ret = mlx5_eswitch_load_pf_vf_vport(esw, MLX5_VPORT_ECPF, enabled_events);
                if (ret)
                        goto ecpf_err;
-               if (mlx5_core_ec_sriov_enabled(esw->dev)) {
-                       ret = mlx5_eswitch_load_ec_vf_vports(esw, esw->esw_funcs.num_ec_vfs,
-                                                            enabled_events);
-                       if (ret)
-                               goto ec_vf_err;
-               }
+       }
+
+       /* Enable ECVF vports */
+       if (mlx5_core_ec_sriov_enabled(esw->dev)) {
+               ret = mlx5_eswitch_load_ec_vf_vports(esw,
+                                                    esw->esw_funcs.num_ec_vfs,
+                                                    enabled_events);
+               if (ret)
+                       goto ec_vf_err;
        }
 
        /* Enable VF vports */
@@ -1331,9 +1334,11 @@ void mlx5_eswitch_disable_pf_vf_vports(struct mlx5_eswitch *esw)
 {
        mlx5_eswitch_unload_vf_vports(esw, esw->esw_funcs.num_vfs);
 
+       if (mlx5_core_ec_sriov_enabled(esw->dev))
+               mlx5_eswitch_unload_ec_vf_vports(esw,
+                                                esw->esw_funcs.num_ec_vfs);
+
        if (mlx5_ecpf_vport_exists(esw->dev)) {
-               if (mlx5_core_ec_sriov_enabled(esw->dev))
-                       mlx5_eswitch_unload_ec_vf_vports(esw, esw->esw_funcs.num_vfs);
                mlx5_eswitch_unload_pf_vf_vport(esw, MLX5_VPORT_ECPF);
        }