mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-09 14:50:19 +00:00
net/mlx5e: Move mod hdr allocation to a single place
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>
This commit is contained in:
parent
61c6f0d190
commit
d9581e2fa7
@ -3354,10 +3354,50 @@ 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;
|
||||
@ -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;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user