Commit ef78b8d5 authored by Roi Dayan's avatar Roi Dayan Committed by Saeed Mahameed
Browse files

net/mlx5e: TC, Use common function allocating flow mod hdr or encap mod hdr



Use mlx5e_tc_attach_mod_hdr() when allocating encap mod hdr and
remove mlx5e_tc_add_flow_mod_hdr() which is not being used now.

Signed-off-by: default avatarRoi Dayan <roid@nvidia.com>
Reviewed-by: default avatarMaor Dickman <maord@nvidia.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@nvidia.com>
parent c43182e6
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -1349,7 +1349,8 @@ static void mlx5e_invalidate_encap(struct mlx5e_priv *priv,
			mlx5e_tc_unoffload_from_slow_path(esw, flow);
		else
			mlx5e_tc_unoffload_fdb_rules(esw, flow, flow->attr);
		mlx5_modify_header_dealloc(priv->mdev, attr->modify_hdr);

		mlx5e_tc_detach_mod_hdr(priv, flow, attr);
		attr->modify_hdr = NULL;

		esw_attr->dests[flow->tmp_entry_index].flags &=
@@ -1405,7 +1406,7 @@ static void mlx5e_reoffload_encap(struct mlx5e_priv *priv,
			continue;
		}

		err = mlx5e_tc_add_flow_mod_hdr(priv, flow, attr);
		err = mlx5e_tc_attach_mod_hdr(priv, flow, attr);
		if (err) {
			mlx5_core_warn(priv->mdev, "Failed to update flow mod_hdr err=%d",
				       err);
+15 −46
Original line number Diff line number Diff line
@@ -646,7 +646,7 @@ get_mod_hdr_table(struct mlx5e_priv *priv, struct mlx5e_tc_flow *flow)
		&tc->mod_hdr;
}

static int mlx5e_tc_attach_mod_hdr(struct mlx5e_priv *priv,
int mlx5e_tc_attach_mod_hdr(struct mlx5e_priv *priv,
			    struct mlx5e_tc_flow *flow,
			    struct mlx5_flow_attr *attr)
{
@@ -665,7 +665,7 @@ static int mlx5e_tc_attach_mod_hdr(struct mlx5e_priv *priv,
	return 0;
}

static void mlx5e_tc_detach_mod_hdr(struct mlx5e_priv *priv,
void mlx5e_tc_detach_mod_hdr(struct mlx5e_priv *priv,
			     struct mlx5e_tc_flow *flow,
			     struct mlx5_flow_attr *attr)
{
@@ -1762,26 +1762,6 @@ int mlx5e_tc_query_route_vport(struct net_device *out_dev, struct net_device *ro
	return err;
}

int mlx5e_tc_add_flow_mod_hdr(struct mlx5e_priv *priv,
			      struct mlx5e_tc_flow *flow,
			      struct mlx5_flow_attr *attr)
{
	struct mlx5e_tc_mod_hdr_acts *mod_hdr_acts = &attr->parse_attr->mod_hdr_acts;
	struct mlx5_modify_hdr *mod_hdr;

	mod_hdr = mlx5_modify_header_alloc(priv->mdev,
					   mlx5e_get_flow_namespace(flow),
					   mod_hdr_acts->num_actions,
					   mod_hdr_acts->actions);
	if (IS_ERR(mod_hdr))
		return PTR_ERR(mod_hdr);

	WARN_ON(attr->modify_hdr);
	attr->modify_hdr = mod_hdr;

	return 0;
}

static int
set_encap_dests(struct mlx5e_priv *priv,
		struct mlx5e_tc_flow *flow,
@@ -1901,7 +1881,6 @@ verify_attr_actions(u32 actions, struct netlink_ext_ack *extack)
static int
post_process_attr(struct mlx5e_tc_flow *flow,
		  struct mlx5_flow_attr *attr,
		  bool is_post_act_attr,
		  struct netlink_ext_ack *extack)
{
	struct mlx5_eswitch *esw = flow->priv->mdev->priv.eswitch;
@@ -1923,27 +1902,21 @@ post_process_attr(struct mlx5e_tc_flow *flow,
	}

	if (attr->action & MLX5_FLOW_CONTEXT_ACTION_MOD_HDR) {
		if (vf_tun || is_post_act_attr) {
			err = mlx5e_tc_add_flow_mod_hdr(flow->priv, flow, attr);
			if (err)
				goto err_out;
		} else {
		err = mlx5e_tc_attach_mod_hdr(flow->priv, flow, attr);
		if (err)
			goto err_out;
	}
	}

	if (attr->branch_true &&
	    attr->branch_true->action & MLX5_FLOW_CONTEXT_ACTION_MOD_HDR) {
		err = mlx5e_tc_add_flow_mod_hdr(flow->priv, flow, attr->branch_true);
		err = mlx5e_tc_attach_mod_hdr(flow->priv, flow, attr->branch_true);
		if (err)
			goto err_out;
	}

	if (attr->branch_false &&
	    attr->branch_false->action & MLX5_FLOW_CONTEXT_ACTION_MOD_HDR) {
		err = mlx5e_tc_add_flow_mod_hdr(flow->priv, flow, attr->branch_false);
		err = mlx5e_tc_attach_mod_hdr(flow->priv, flow, attr->branch_false);
		if (err)
			goto err_out;
	}
@@ -2057,7 +2030,7 @@ mlx5e_tc_add_fdb_flow(struct mlx5e_priv *priv,
		esw_attr->int_port = int_port;
	}

	err = post_process_attr(flow, attr, false, extack);
	err = post_process_attr(flow, attr, extack);
	if (err)
		goto err_out;

@@ -2142,9 +2115,6 @@ static void mlx5e_tc_del_fdb_flow(struct mlx5e_priv *priv,

	if (attr->action & MLX5_FLOW_CONTEXT_ACTION_MOD_HDR) {
		mlx5e_mod_hdr_dealloc(&attr->parse_attr->mod_hdr_acts);
		if (vf_tun && attr->modify_hdr)
			mlx5_modify_header_dealloc(priv->mdev, attr->modify_hdr);
		else
		mlx5e_tc_detach_mod_hdr(priv, flow, attr);
	}

@@ -3964,7 +3934,7 @@ alloc_flow_post_acts(struct mlx5e_tc_flow *flow, struct netlink_ext_ack *extack)
		if (err)
			goto out_free;

		err = post_process_attr(flow, attr, true, extack);
		err = post_process_attr(flow, attr, extack);
		if (err)
			goto out_free;

@@ -4531,8 +4501,7 @@ mlx5_free_flow_attr(struct mlx5e_tc_flow *flow, struct mlx5_flow_attr *attr)

	if (attr->action & MLX5_FLOW_CONTEXT_ACTION_MOD_HDR) {
		mlx5e_mod_hdr_dealloc(&attr->parse_attr->mod_hdr_acts);
		if (attr->modify_hdr)
			mlx5_modify_header_dealloc(flow->priv->mdev, attr->modify_hdr);
		mlx5e_tc_detach_mod_hdr(flow->priv, flow, attr);
	}
}

+7 −3
Original line number Diff line number Diff line
@@ -287,7 +287,11 @@ int mlx5e_tc_match_to_reg_set_and_get_id(struct mlx5_core_dev *mdev,
					 enum mlx5e_tc_attr_to_reg type,
					 u32 data);

int mlx5e_tc_add_flow_mod_hdr(struct mlx5e_priv *priv,
int mlx5e_tc_attach_mod_hdr(struct mlx5e_priv *priv,
			    struct mlx5e_tc_flow *flow,
			    struct mlx5_flow_attr *attr);

void mlx5e_tc_detach_mod_hdr(struct mlx5e_priv *priv,
			     struct mlx5e_tc_flow *flow,
			     struct mlx5_flow_attr *attr);