]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net/mlx5e: Dealloc forgotten PSP RX modify header
authorCosmin Ratiu <cratiu@nvidia.com>
Thu, 25 Dec 2025 13:27:17 +0000 (15:27 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 17 Jan 2026 15:35:23 +0000 (16:35 +0100)
[ Upstream commit 0462a15d2d1fafd3d48cf3c7c67393e42d03908c ]

The commit which added RX steering rules for PSP forgot to free a modify
header HW object on the cleanup path, which lead to health errors when
reloading the driver and uninitializing the device:

mlx5_core 0000:08:00.0: poll_health:803:(pid 3021): Fatal error 3 detected

Fix that by saving the modify header pointer in the PSP steering struct
and deallocating it after freeing the rule which references it.

Fixes: 9536fbe10c9d ("net/mlx5e: Add PSP steering in local NIC RX")
Signed-off-by: Cosmin Ratiu <cratiu@nvidia.com>
Reviewed-by: Dragos Tatulea <dtatulea@nvidia.com>
Reviewed-by: Tariq Toukan <tariqt@nvidia.com>
Signed-off-by: Mark Bloch <mbloch@nvidia.com>
Link: https://patch.msgid.link/20251225132717.358820-6-mbloch@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/en_accel/psp.c

index 8565cfe8d7dce8706f021007ee7fb61488c016cf..943d6fc6e7a0474845b0bef6ab578adcdf8aedd2 100644 (file)
@@ -41,6 +41,7 @@ struct mlx5e_accel_fs_psp_prot {
        struct mlx5_flow_table *ft;
        struct mlx5_flow_group *miss_group;
        struct mlx5_flow_handle *miss_rule;
+       struct mlx5_modify_hdr *rx_modify_hdr;
        struct mlx5_flow_destination default_dest;
        struct mlx5e_psp_rx_err rx_err;
        u32 refcnt;
@@ -217,13 +218,19 @@ out_err:
        return err;
 }
 
-static void accel_psp_fs_rx_fs_destroy(struct mlx5e_accel_fs_psp_prot *fs_prot)
+static void accel_psp_fs_rx_fs_destroy(struct mlx5e_psp_fs *fs,
+                                      struct mlx5e_accel_fs_psp_prot *fs_prot)
 {
        if (fs_prot->def_rule) {
                mlx5_del_flow_rules(fs_prot->def_rule);
                fs_prot->def_rule = NULL;
        }
 
+       if (fs_prot->rx_modify_hdr) {
+               mlx5_modify_header_dealloc(fs->mdev, fs_prot->rx_modify_hdr);
+               fs_prot->rx_modify_hdr = NULL;
+       }
+
        if (fs_prot->miss_rule) {
                mlx5_del_flow_rules(fs_prot->miss_rule);
                fs_prot->miss_rule = NULL;
@@ -327,6 +334,7 @@ static int accel_psp_fs_rx_create_ft(struct mlx5e_psp_fs *fs,
                modify_hdr = NULL;
                goto out_err;
        }
+       fs_prot->rx_modify_hdr = modify_hdr;
 
        flow_act.action = MLX5_FLOW_CONTEXT_ACTION_FWD_DEST |
                          MLX5_FLOW_CONTEXT_ACTION_CRYPTO_DECRYPT |
@@ -347,7 +355,7 @@ static int accel_psp_fs_rx_create_ft(struct mlx5e_psp_fs *fs,
        goto out;
 
 out_err:
-       accel_psp_fs_rx_fs_destroy(fs_prot);
+       accel_psp_fs_rx_fs_destroy(fs, fs_prot);
 out:
        kvfree(flow_group_in);
        kvfree(spec);
@@ -364,7 +372,7 @@ static int accel_psp_fs_rx_destroy(struct mlx5e_psp_fs *fs, enum accel_fs_psp_ty
        /* The netdev unreg already happened, so all offloaded rule are already removed */
        fs_prot = &accel_psp->fs_prot[type];
 
-       accel_psp_fs_rx_fs_destroy(fs_prot);
+       accel_psp_fs_rx_fs_destroy(fs, fs_prot);
 
        accel_psp_fs_rx_err_destroy_ft(fs, &fs_prot->rx_err);