forked from mirrors/linux
		
	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
					
				
					 3 changed files with 6 additions and 74 deletions
				
			
		|  | @ -43,13 +43,14 @@ tc_act_parse_ct(struct mlx5e_tc_act_parse_state *parse_state, | |||
| 	if (err) | ||||
| 		return err; | ||||
| 
 | ||||
| 	flow_flag_set(parse_state->flow, CT); | ||||
| 
 | ||||
| 	if (mlx5e_is_eswitch_flow(parse_state->flow)) | ||||
| 		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; | ||||
| 	} | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
|  |  | |||
|  | @ -1926,68 +1926,6 @@ __mlx5_tc_ct_flow_offload(struct mlx5_tc_ct_priv *ct_priv, | |||
| 	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 * | ||||
| mlx5_tc_ct_flow_offload(struct mlx5_tc_ct_priv *priv, | ||||
| 			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 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; | ||||
| 
 | ||||
| 	if (!priv) | ||||
| 		return ERR_PTR(-EOPNOTSUPP); | ||||
| 
 | ||||
| 	mutex_lock(&priv->control_lock); | ||||
| 
 | ||||
| 	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); | ||||
| 	rule = __mlx5_tc_ct_flow_offload(priv, flow, spec, attr); | ||||
| 	mutex_unlock(&priv->control_lock); | ||||
| 
 | ||||
| 	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 mlx5e_priv *priv = netdev_priv(ct_priv->netdev); | ||||
| 
 | ||||
| 	mlx5_tc_rule_delete(priv, ct_flow->pre_ct_rule, | ||||
| 			    pre_ct_attr); | ||||
| 	mlx5_tc_rule_delete(priv, ct_flow->pre_ct_rule, pre_ct_attr); | ||||
| 	mlx5_modify_header_dealloc(priv->mdev, pre_ct_attr->modify_hdr); | ||||
| 
 | ||||
| 	if (ct_flow->post_act_handle) { | ||||
|  |  | |||
|  | @ -1574,8 +1574,7 @@ mlx5e_tc_add_fdb_flow(struct mlx5e_priv *priv, | |||
| 	if (err) | ||||
| 		goto err_out; | ||||
| 
 | ||||
| 	if (attr->action & MLX5_FLOW_CONTEXT_ACTION_MOD_HDR && | ||||
| 	    !(attr->ct_attr.ct_action & TCA_CT_ACT_CLEAR)) { | ||||
| 	if (attr->action & MLX5_FLOW_CONTEXT_ACTION_MOD_HDR) { | ||||
| 		if (vf_tun) { | ||||
| 			err = mlx5e_tc_add_flow_mod_hdr(priv, flow, attr); | ||||
| 			if (err) | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Roi Dayan
						Roi Dayan