]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net/mlx5: CT: Fix header-rewrite re-use for tupels
authorPaul Blakey <paulb@nvidia.com>
Mon, 23 May 2022 16:12:21 +0000 (19:12 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 14 Jun 2022 16:41:24 +0000 (18:41 +0200)
[ Upstream commit 1f2856cde64baa78475e6d3c601fb7b7f693a161 ]

Tuple entries that don't have nat configured for them
which are added to the ct nat table will always create
a new modify header, as we don't check for possible
re-use on them. The same for tuples that have nat configured
for them but are added to ct table.

Fix the above by only avoiding wasteful re-use lookup
for actually natted entries in ct nat table.

Fixes: 7fac5c2eced3 ("net/mlx5: CT: Avoid reusing modify header context for natted entries")
Signed-off-by: Paul Blakey <paulb@nvidia.com>
Reviewed-by: Ariel Levkovich <lariel@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/en/tc_ct.c

index 9028e9958c72d89814e5664ffda557be01a43de3..cf9d48d934efc0e1dfbdecd5895eb750b540f2ba 100644 (file)
@@ -692,7 +692,7 @@ mlx5_tc_ct_entry_create_mod_hdr(struct mlx5_tc_ct_priv *ct_priv,
                                struct mlx5_flow_attr *attr,
                                struct flow_rule *flow_rule,
                                struct mlx5e_mod_hdr_handle **mh,
-                               u8 zone_restore_id, bool nat)
+                               u8 zone_restore_id, bool nat_table, bool has_nat)
 {
        DECLARE_MOD_HDR_ACTS_ACTIONS(actions_arr, MLX5_CT_MIN_MOD_ACTS);
        DECLARE_MOD_HDR_ACTS(mod_acts, actions_arr);
@@ -708,11 +708,12 @@ mlx5_tc_ct_entry_create_mod_hdr(struct mlx5_tc_ct_priv *ct_priv,
                                     &attr->ct_attr.ct_labels_id);
        if (err)
                return -EOPNOTSUPP;
-       if (nat) {
-               err = mlx5_tc_ct_entry_create_nat(ct_priv, flow_rule,
-                                                 &mod_acts);
-               if (err)
-                       goto err_mapping;
+       if (nat_table) {
+               if (has_nat) {
+                       err = mlx5_tc_ct_entry_create_nat(ct_priv, flow_rule, &mod_acts);
+                       if (err)
+                               goto err_mapping;
+               }
 
                ct_state |= MLX5_CT_STATE_NAT_BIT;
        }
@@ -727,7 +728,7 @@ mlx5_tc_ct_entry_create_mod_hdr(struct mlx5_tc_ct_priv *ct_priv,
        if (err)
                goto err_mapping;
 
-       if (nat) {
+       if (nat_table && has_nat) {
                attr->modify_hdr = mlx5_modify_header_alloc(ct_priv->dev, ct_priv->ns_type,
                                                            mod_acts.num_actions,
                                                            mod_acts.actions);
@@ -795,7 +796,9 @@ mlx5_tc_ct_entry_add_rule(struct mlx5_tc_ct_priv *ct_priv,
 
        err = mlx5_tc_ct_entry_create_mod_hdr(ct_priv, attr, flow_rule,
                                              &zone_rule->mh,
-                                             zone_restore_id, nat);
+                                             zone_restore_id,
+                                             nat,
+                                             mlx5_tc_ct_entry_has_nat(entry));
        if (err) {
                ct_dbg("Failed to create ct entry mod hdr");
                goto err_mod_hdr;