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) | 	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 @@ __mlx5_tc_ct_flow_offload(struct mlx5_tc_ct_priv *ct_priv, | ||||||
| 	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,17 +1933,12 @@ 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); | ||||||
| 
 |  | ||||||
| 	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); | 	mutex_unlock(&priv->control_lock); | ||||||
| 
 | 
 | ||||||
|  | @ -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 a new issue
	
	 Roi Dayan
						Roi Dayan