mirror of
https://github.com/torvalds/linux.git
synced 2024-12-11 05:33:09 +00:00
net/mlx5e: CT, Don't set flow flag CT for ct clear flow
ct clear action is a normal flow with a modify header for registers to 0. there is no need for any special handling in tc_ct.c. Parsing of ct clear action still allocates mod acts to set 0 on the registers and the driver continue to add a normal rule with modify hdr context. Signed-off-by: Roi Dayan <roid@nvidia.com> Reviewed-by: Oz Shlomo <ozsh@nvidia.com> Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
This commit is contained in:
parent
eeed226ed1
commit
efe6f961cd
@ -43,13 +43,14 @@ tc_act_parse_ct(struct mlx5e_tc_act_parse_state *parse_state,
|
|||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
flow_flag_set(parse_state->flow, CT);
|
|
||||||
|
|
||||||
if (mlx5e_is_eswitch_flow(parse_state->flow))
|
if (mlx5e_is_eswitch_flow(parse_state->flow))
|
||||||
attr->esw_attr->split_count = attr->esw_attr->out_count;
|
attr->esw_attr->split_count = attr->esw_attr->out_count;
|
||||||
|
|
||||||
if (!clear_action)
|
if (!clear_action) {
|
||||||
|
flow_flag_set(parse_state->flow, CT);
|
||||||
parse_state->ct = true;
|
parse_state->ct = true;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1926,68 +1926,6 @@ err_ft:
|
|||||||
return ERR_PTR(err);
|
return ERR_PTR(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct mlx5_flow_handle *
|
|
||||||
__mlx5_tc_ct_flow_offload_clear(struct mlx5_tc_ct_priv *ct_priv,
|
|
||||||
struct mlx5_flow_spec *orig_spec,
|
|
||||||
struct mlx5_flow_attr *attr,
|
|
||||||
struct mlx5e_tc_mod_hdr_acts *mod_acts)
|
|
||||||
{
|
|
||||||
struct mlx5e_priv *priv = netdev_priv(ct_priv->netdev);
|
|
||||||
u32 attr_sz = ns_to_attr_sz(ct_priv->ns_type);
|
|
||||||
struct mlx5_flow_attr *pre_ct_attr;
|
|
||||||
struct mlx5_modify_hdr *mod_hdr;
|
|
||||||
struct mlx5_flow_handle *rule;
|
|
||||||
struct mlx5_ct_flow *ct_flow;
|
|
||||||
int err;
|
|
||||||
|
|
||||||
ct_flow = kzalloc(sizeof(*ct_flow), GFP_KERNEL);
|
|
||||||
if (!ct_flow)
|
|
||||||
return ERR_PTR(-ENOMEM);
|
|
||||||
|
|
||||||
/* Base esw attributes on original rule attribute */
|
|
||||||
pre_ct_attr = mlx5_alloc_flow_attr(ct_priv->ns_type);
|
|
||||||
if (!pre_ct_attr) {
|
|
||||||
err = -ENOMEM;
|
|
||||||
goto err_attr;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(pre_ct_attr, attr, attr_sz);
|
|
||||||
|
|
||||||
mod_hdr = mlx5_modify_header_alloc(priv->mdev, ct_priv->ns_type,
|
|
||||||
mod_acts->num_actions,
|
|
||||||
mod_acts->actions);
|
|
||||||
if (IS_ERR(mod_hdr)) {
|
|
||||||
err = PTR_ERR(mod_hdr);
|
|
||||||
ct_dbg("Failed to add create ct clear mod hdr");
|
|
||||||
goto err_mod_hdr;
|
|
||||||
}
|
|
||||||
|
|
||||||
pre_ct_attr->modify_hdr = mod_hdr;
|
|
||||||
|
|
||||||
rule = mlx5_tc_rule_insert(priv, orig_spec, pre_ct_attr);
|
|
||||||
if (IS_ERR(rule)) {
|
|
||||||
err = PTR_ERR(rule);
|
|
||||||
ct_dbg("Failed to add ct clear rule");
|
|
||||||
goto err_insert;
|
|
||||||
}
|
|
||||||
|
|
||||||
attr->ct_attr.ct_flow = ct_flow;
|
|
||||||
ct_flow->pre_ct_attr = pre_ct_attr;
|
|
||||||
ct_flow->pre_ct_rule = rule;
|
|
||||||
return rule;
|
|
||||||
|
|
||||||
err_insert:
|
|
||||||
mlx5_modify_header_dealloc(priv->mdev, mod_hdr);
|
|
||||||
err_mod_hdr:
|
|
||||||
netdev_warn(priv->netdev,
|
|
||||||
"Failed to offload ct clear flow, err %d\n", err);
|
|
||||||
kfree(pre_ct_attr);
|
|
||||||
err_attr:
|
|
||||||
kfree(ct_flow);
|
|
||||||
|
|
||||||
return ERR_PTR(err);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct mlx5_flow_handle *
|
struct mlx5_flow_handle *
|
||||||
mlx5_tc_ct_flow_offload(struct mlx5_tc_ct_priv *priv,
|
mlx5_tc_ct_flow_offload(struct mlx5_tc_ct_priv *priv,
|
||||||
struct mlx5e_tc_flow *flow,
|
struct mlx5e_tc_flow *flow,
|
||||||
@ -1995,18 +1933,13 @@ mlx5_tc_ct_flow_offload(struct mlx5_tc_ct_priv *priv,
|
|||||||
struct mlx5_flow_attr *attr,
|
struct mlx5_flow_attr *attr,
|
||||||
struct mlx5e_tc_mod_hdr_acts *mod_hdr_acts)
|
struct mlx5e_tc_mod_hdr_acts *mod_hdr_acts)
|
||||||
{
|
{
|
||||||
bool clear_action = attr->ct_attr.ct_action & TCA_CT_ACT_CLEAR;
|
|
||||||
struct mlx5_flow_handle *rule;
|
struct mlx5_flow_handle *rule;
|
||||||
|
|
||||||
if (!priv)
|
if (!priv)
|
||||||
return ERR_PTR(-EOPNOTSUPP);
|
return ERR_PTR(-EOPNOTSUPP);
|
||||||
|
|
||||||
mutex_lock(&priv->control_lock);
|
mutex_lock(&priv->control_lock);
|
||||||
|
rule = __mlx5_tc_ct_flow_offload(priv, flow, spec, attr);
|
||||||
if (clear_action)
|
|
||||||
rule = __mlx5_tc_ct_flow_offload_clear(priv, spec, attr, mod_hdr_acts);
|
|
||||||
else
|
|
||||||
rule = __mlx5_tc_ct_flow_offload(priv, flow, spec, attr);
|
|
||||||
mutex_unlock(&priv->control_lock);
|
mutex_unlock(&priv->control_lock);
|
||||||
|
|
||||||
return rule;
|
return rule;
|
||||||
@ -2020,8 +1953,7 @@ __mlx5_tc_ct_delete_flow(struct mlx5_tc_ct_priv *ct_priv,
|
|||||||
struct mlx5_flow_attr *pre_ct_attr = ct_flow->pre_ct_attr;
|
struct mlx5_flow_attr *pre_ct_attr = ct_flow->pre_ct_attr;
|
||||||
struct mlx5e_priv *priv = netdev_priv(ct_priv->netdev);
|
struct mlx5e_priv *priv = netdev_priv(ct_priv->netdev);
|
||||||
|
|
||||||
mlx5_tc_rule_delete(priv, ct_flow->pre_ct_rule,
|
mlx5_tc_rule_delete(priv, ct_flow->pre_ct_rule, pre_ct_attr);
|
||||||
pre_ct_attr);
|
|
||||||
mlx5_modify_header_dealloc(priv->mdev, pre_ct_attr->modify_hdr);
|
mlx5_modify_header_dealloc(priv->mdev, pre_ct_attr->modify_hdr);
|
||||||
|
|
||||||
if (ct_flow->post_act_handle) {
|
if (ct_flow->post_act_handle) {
|
||||||
|
@ -1574,8 +1574,7 @@ mlx5e_tc_add_fdb_flow(struct mlx5e_priv *priv,
|
|||||||
if (err)
|
if (err)
|
||||||
goto err_out;
|
goto err_out;
|
||||||
|
|
||||||
if (attr->action & MLX5_FLOW_CONTEXT_ACTION_MOD_HDR &&
|
if (attr->action & MLX5_FLOW_CONTEXT_ACTION_MOD_HDR) {
|
||||||
!(attr->ct_attr.ct_action & TCA_CT_ACT_CLEAR)) {
|
|
||||||
if (vf_tun) {
|
if (vf_tun) {
|
||||||
err = mlx5e_tc_add_flow_mod_hdr(priv, flow, attr);
|
err = mlx5e_tc_add_flow_mod_hdr(priv, flow, attr);
|
||||||
if (err)
|
if (err)
|
||||||
|
Loading…
Reference in New Issue
Block a user