OSDN Git Service

net/mlx5e: Move mod hdr allocation to a single place
authorRoi Dayan <roid@nvidia.com>
Thu, 12 Aug 2021 12:46:34 +0000 (15:46 +0300)
committerSaeed Mahameed <saeedm@nvidia.com>
Tue, 5 Oct 2021 01:10:52 +0000 (18:10 -0700)
Move mod hdr allocation chunk from parse_tc_fdb_actions() and
parse_tc_nic_actions() to a shared function.

Signed-off-by: Roi Dayan <roid@nvidia.com>
Reviewed-by: Maor Dickman <maord@nvidia.com>
Reviewed-by: Oz Shlomo <ozsh@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c

index 0e03cef..f39589f 100644 (file)
@@ -3354,11 +3354,51 @@ static int validate_goto_chain(struct mlx5e_priv *priv,
        return 0;
 }
 
-static int parse_tc_nic_actions(struct mlx5e_priv *priv,
-                               struct flow_action *flow_action,
+static int
+actions_prepare_mod_hdr_actions(struct mlx5e_priv *priv,
                                struct mlx5e_tc_flow *flow,
+                               struct mlx5_flow_attr *attr,
+                               struct pedit_headers_action *hdrs,
                                struct netlink_ext_ack *extack)
 {
+       struct mlx5e_tc_flow_parse_attr *parse_attr = attr->parse_attr;
+       enum mlx5_flow_namespace_type ns_type;
+       int err;
+
+       if (!hdrs[TCA_PEDIT_KEY_EX_CMD_SET].pedits &&
+           !hdrs[TCA_PEDIT_KEY_EX_CMD_ADD].pedits)
+               return 0;
+
+       ns_type = get_flow_name_space(flow);
+
+       err = alloc_tc_pedit_action(priv, ns_type, parse_attr, hdrs,
+                                   &attr->action, extack);
+       if (err)
+               return err;
+
+       /* In case all pedit actions are skipped, remove the MOD_HDR flag. */
+       if (parse_attr->mod_hdr_acts.num_actions > 0)
+               return 0;
+
+       attr->action &= ~MLX5_FLOW_CONTEXT_ACTION_MOD_HDR;
+       dealloc_mod_hdr_actions(&parse_attr->mod_hdr_acts);
+
+       if (ns_type != MLX5_FLOW_NAMESPACE_FDB)
+               return 0;
+
+       if (!((attr->action & MLX5_FLOW_CONTEXT_ACTION_VLAN_POP) ||
+             (attr->action & MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH)))
+               attr->esw_attr->split_count = 0;
+
+       return 0;
+}
+
+static int
+parse_tc_nic_actions(struct mlx5e_priv *priv,
+                    struct flow_action *flow_action,
+                    struct mlx5e_tc_flow *flow,
+                    struct netlink_ext_ack *extack)
+{
        struct mlx5e_tc_flow_parse_attr *parse_attr;
        struct mlx5_flow_attr *attr = flow->attr;
        struct pedit_headers_action hdrs[2] = {};
@@ -3467,21 +3507,6 @@ static int parse_tc_nic_actions(struct mlx5e_priv *priv,
                }
        }
 
-       if (hdrs[TCA_PEDIT_KEY_EX_CMD_SET].pedits ||
-           hdrs[TCA_PEDIT_KEY_EX_CMD_ADD].pedits) {
-               err = alloc_tc_pedit_action(priv, MLX5_FLOW_NAMESPACE_KERNEL,
-                                           parse_attr, hdrs, &action, extack);
-               if (err)
-                       return err;
-               /* in case all pedit actions are skipped, remove the MOD_HDR
-                * flag.
-                */
-               if (parse_attr->mod_hdr_acts.num_actions == 0) {
-                       action &= ~MLX5_FLOW_CONTEXT_ACTION_MOD_HDR;
-                       dealloc_mod_hdr_actions(&parse_attr->mod_hdr_acts);
-               }
-       }
-
        attr->action = action;
 
        if (attr->dest_chain && parse_attr->mirred_ifindex[0]) {
@@ -3489,6 +3514,10 @@ static int parse_tc_nic_actions(struct mlx5e_priv *priv,
                return -EOPNOTSUPP;
        }
 
+       err = actions_prepare_mod_hdr_actions(priv, flow, attr, hdrs, extack);
+       if (err)
+               return err;
+
        if (!actions_match_supported(priv, flow_action, parse_attr, flow, extack))
                return -EOPNOTSUPP;
 
@@ -4043,26 +4072,12 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv,
                        return err;
        }
 
-       if (hdrs[TCA_PEDIT_KEY_EX_CMD_SET].pedits ||
-           hdrs[TCA_PEDIT_KEY_EX_CMD_ADD].pedits) {
-               err = alloc_tc_pedit_action(priv, MLX5_FLOW_NAMESPACE_FDB,
-                                           parse_attr, hdrs, &action, extack);
-               if (err)
-                       return err;
-               /* in case all pedit actions are skipped, remove the MOD_HDR
-                * flag. we might have set split_count either by pedit or
-                * pop/push. if there is no pop/push either, reset it too.
-                */
-               if (parse_attr->mod_hdr_acts.num_actions == 0) {
-                       action &= ~MLX5_FLOW_CONTEXT_ACTION_MOD_HDR;
-                       dealloc_mod_hdr_actions(&parse_attr->mod_hdr_acts);
-                       if (!((action & MLX5_FLOW_CONTEXT_ACTION_VLAN_POP) ||
-                             (action & MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH)))
-                               esw_attr->split_count = 0;
-               }
-       }
-
        attr->action = action;
+
+       err = actions_prepare_mod_hdr_actions(priv, flow, attr, hdrs, extack);
+       if (err)
+               return err;
+
        if (!actions_match_supported(priv, flow_action, parse_attr, flow, extack))
                return -EOPNOTSUPP;