Commit 40ff097f authored by Yevgeny Kliteynik's avatar Yevgeny Kliteynik Committed by Saeed Mahameed
Browse files

net/mlx5: DR, Modify header action of size 1 optimization



Set modify header action of size 1 directly on the STE for supporting
devices, thus reducing number of hops and cache misses.

Signed-off-by: default avatarYevgeny Kliteynik <kliteyn@nvidia.com>
Reviewed-by: default avatarAlex Vesker <valex@nvidia.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@nvidia.com>
parent 947e2585
Loading
Loading
Loading
Loading
+26 −11
Original line number Diff line number Diff line
@@ -832,8 +832,13 @@ int mlx5dr_actions_build_ste_arr(struct mlx5dr_matcher *matcher,
			}
			break;
		case DR_ACTION_TYP_MODIFY_HDR:
			if (action->rewrite->single_action_opt) {
				attr.modify_actions = action->rewrite->num_of_actions;
				attr.single_modify_action = action->rewrite->data;
			} else {
				if (action->rewrite->ptrn && action->rewrite->arg) {
				attr.modify_index = mlx5dr_arg_get_obj_id(action->rewrite->arg);
					attr.modify_index =
						mlx5dr_arg_get_obj_id(action->rewrite->arg);
					attr.modify_actions = action->rewrite->ptrn->num_of_actions;
					attr.modify_pat_idx = action->rewrite->ptrn->index;
				} else {
@@ -841,6 +846,7 @@ int mlx5dr_actions_build_ste_arr(struct mlx5dr_matcher *matcher,
					attr.modify_actions = action->rewrite->num_of_actions;
					attr.modify_pat_idx = MLX5DR_INVALID_PATTERN_INDEX;
				}
			}
			if (action->rewrite->modify_ttl)
				dr_action_modify_ttl_adjust(dmn, &attr, rx_rule,
							    &recalc_cs_required);
@@ -1998,9 +2004,15 @@ static int dr_action_create_modify_action(struct mlx5dr_domain *dmn,
	action->rewrite->data = (u8 *)hw_actions;
	action->rewrite->num_of_actions = num_hw_actions;

	if (num_hw_actions == 1 &&
	    dmn->info.caps.sw_format_ver >= MLX5_STEERING_FORMAT_CONNECTX_6DX) {
		action->rewrite->single_action_opt = true;
	} else {
		action->rewrite->single_action_opt = false;
		ret = mlx5dr_ste_alloc_modify_hdr(action);
		if (ret)
			goto free_hw_actions;
	}

	return 0;

@@ -2151,6 +2163,7 @@ int mlx5dr_action_destroy(struct mlx5dr_action *action)
		break;
	case DR_ACTION_TYP_TNL_L3_TO_L2:
		mlx5dr_ste_free_modify_hdr(action);
		kfree(action->rewrite->data);
		refcount_dec(&action->rewrite->dmn->refcount);
		break;
	case DR_ACTION_TYP_L2_TO_TNL_L2:
@@ -2161,7 +2174,9 @@ int mlx5dr_action_destroy(struct mlx5dr_action *action)
		refcount_dec(&action->reformat->dmn->refcount);
		break;
	case DR_ACTION_TYP_MODIFY_HDR:
		if (!action->rewrite->single_action_opt)
			mlx5dr_ste_free_modify_hdr(action);
		kfree(action->rewrite->data);
		refcount_dec(&action->rewrite->dmn->refcount);
		break;
	case DR_ACTION_TYP_SAMPLER:
+24 −14
Original line number Diff line number Diff line
@@ -499,8 +499,12 @@ static void dr_ste_v1_set_accelerated_rewrite_actions(u8 *hw_ste_p,
						      u8 *d_action,
						      u16 num_of_actions,
						      u32 rewrite_pattern,
						      u32 rewrite_args)
						      u32 rewrite_args,
						      u8 *action_data)
{
	if (action_data) {
		memcpy(d_action, action_data, DR_MODIFY_ACTION_SIZE);
	} else {
		MLX5_SET(ste_double_action_accelerated_modify_action_list_v1, d_action,
			 action_id, DR_STE_V1_ACTION_ID_ACCELERATED_LIST);
		MLX5_SET(ste_double_action_accelerated_modify_action_list_v1, d_action,
@@ -509,6 +513,7 @@ static void dr_ste_v1_set_accelerated_rewrite_actions(u8 *hw_ste_p,
			 number_of_modify_actions, num_of_actions);
		MLX5_SET(ste_double_action_accelerated_modify_action_list_v1, d_action,
			 modify_actions_argument_pointer, rewrite_args);
	}

	dr_ste_v1_set_reparse(hw_ste_p);
}
@@ -532,14 +537,16 @@ static void dr_ste_v1_set_rewrite_actions(u8 *hw_ste_p,
					  u8 *action,
					  u16 num_of_actions,
					  u32 rewrite_pattern,
					  u32 rewrite_args)
					  u32 rewrite_args,
					  u8 *action_data)
{
	if (rewrite_pattern != MLX5DR_INVALID_PATTERN_INDEX)
		return dr_ste_v1_set_accelerated_rewrite_actions(hw_ste_p,
								 action,
								 num_of_actions,
								 rewrite_pattern,
								 rewrite_args);
								 rewrite_args,
								 action_data);

	/* fall back to the code that doesn't support accelerated modify header */
	return dr_ste_v1_set_basic_rewrite_actions(hw_ste_p,
@@ -653,7 +660,8 @@ void dr_ste_v1_set_actions_tx(struct mlx5dr_domain *dmn,
		dr_ste_v1_set_rewrite_actions(last_ste, action,
					      attr->modify_actions,
					      attr->modify_pat_idx,
					      attr->modify_index);
					      attr->modify_index,
					      attr->single_modify_action);
		action_sz -= DR_STE_ACTION_DOUBLE_SZ;
		action += DR_STE_ACTION_DOUBLE_SZ;
		allow_encap = false;
@@ -784,7 +792,8 @@ void dr_ste_v1_set_actions_rx(struct mlx5dr_domain *dmn,
		dr_ste_v1_set_rewrite_actions(last_ste, action,
					      attr->decap_actions,
					      attr->decap_pat_idx,
					      attr->decap_index);
					      attr->decap_index,
					      NULL);
		action_sz -= DR_STE_ACTION_DOUBLE_SZ;
		action += DR_STE_ACTION_DOUBLE_SZ;
		allow_modify_hdr = false;
@@ -840,7 +849,8 @@ void dr_ste_v1_set_actions_rx(struct mlx5dr_domain *dmn,
		dr_ste_v1_set_rewrite_actions(last_ste, action,
					      attr->modify_actions,
					      attr->modify_pat_idx,
					      attr->modify_index);
					      attr->modify_index,
					      attr->single_modify_action);
		action_sz -= DR_STE_ACTION_DOUBLE_SZ;
		action += DR_STE_ACTION_DOUBLE_SZ;
	}
+2 −0
Original line number Diff line number Diff line
@@ -267,6 +267,7 @@ struct mlx5dr_ste_actions_attr {
	u32	modify_index;
	u32	modify_pat_idx;
	u16	modify_actions;
	u8	*single_modify_action;
	u32	decap_index;
	u32	decap_pat_idx;
	u16	decap_actions;
@@ -1035,6 +1036,7 @@ struct mlx5dr_action_rewrite {
	u8 *data;
	u16 num_of_actions;
	u32 index;
	u8 single_action_opt:1;
	u8 allow_rx:1;
	u8 allow_tx:1;
	u8 modify_ttl:1;