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;
                }
        }
 
-       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]) {
                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;
 
                        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;