]> git.ipfire.org Git - thirdparty/kernel/linux.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)
committerJakub Kicinski <kuba@kernel.org>
Sun, 4 Jan 2026 18:38:50 +0000 (10:38 -0800)
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>
drivers/net/ethernet/mellanox/mlx5/core/en_accel/psp.c

index 38e7c77cc8514a9c3e1bfc89303022174e8d72b1..9a74438ce10aa851587b5b9f3e41eaa3ec83835b 100644 (file)
@@ -44,6 +44,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;
@@ -286,13 +287,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;
@@ -396,6 +403,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 |
@@ -416,7 +424,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);
@@ -433,7 +441,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);