Commit d8a2034f authored by Eli Cohen's avatar Eli Cohen Committed by Saeed Mahameed
Browse files

net/mlx5: Don't use termination tables in slow path



Don't use termination tables for packets that are steered to the slow path,
as a pre-step for supporting packet encap (packet reformat) action on
termination tables. Packet encap (reformat action) actions steer the packet
to the slow path until outer arp entries are resolved.

Signed-off-by: default avatarEli Cohen <eli@mellanox.com>
Reviewed-by: default avatarOz Shlomo <ozsh@mellanox.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@mellanox.com>
parent b5f814cc
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -332,6 +332,7 @@ struct mlx5_termtbl_handle;

bool
mlx5_eswitch_termtbl_required(struct mlx5_eswitch *esw,
			      struct mlx5_esw_flow_attr *attr,
			      struct mlx5_flow_act *flow_act,
			      struct mlx5_flow_spec *spec);

@@ -393,6 +394,7 @@ enum {
	MLX5_ESW_ATTR_FLAG_VLAN_HANDLED  = BIT(0),
	MLX5_ESW_ATTR_FLAG_SLOW_PATH     = BIT(1),
	MLX5_ESW_ATTR_FLAG_NO_IN_PORT    = BIT(2),
	MLX5_ESW_ATTR_FLAG_HAIRPIN	 = BIT(3),
};

struct mlx5_esw_flow_attr {
+14 −6
Original line number Diff line number Diff line
@@ -300,6 +300,7 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
	bool split = !!(attr->split_count);
	struct mlx5_flow_handle *rule;
	struct mlx5_flow_table *fdb;
	bool hairpin = false;
	int j, i = 0;

	if (esw->mode != MLX5_ESWITCH_OFFLOADS)
@@ -397,16 +398,21 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
		goto err_esw_get;
	}

	if (mlx5_eswitch_termtbl_required(esw, &flow_act, spec))
	if (mlx5_eswitch_termtbl_required(esw, attr, &flow_act, spec)) {
		rule = mlx5_eswitch_add_termtbl_rule(esw, fdb, spec, attr,
						     &flow_act, dest, i);
	else
		hairpin = true;
	} else {
		rule = mlx5_add_flow_rules(fdb, spec, &flow_act, dest, i);
	}
	if (IS_ERR(rule))
		goto err_add_rule;
	else
		atomic64_inc(&esw->offloads.num_flows);

	if (hairpin)
		attr->flags |= MLX5_ESW_ATTR_FLAG_HAIRPIN;

	return rule;

err_add_rule:
@@ -495,11 +501,13 @@ __mlx5_eswitch_del_rule(struct mlx5_eswitch *esw,

	mlx5_del_flow_rules(rule);

	if (attr->flags & MLX5_ESW_ATTR_FLAG_HAIRPIN) {
		/* unref the term table */
		for (i = 0; i < MLX5_MAX_FLOW_FWD_VPORTS; i++) {
			if (attr->dests[i].termtbl)
				mlx5_eswitch_termtbl_put(esw, attr->dests[i].termtbl);
		}
	}

	atomic64_dec(&esw->offloads.num_flows);

+3 −1
Original line number Diff line number Diff line
@@ -195,10 +195,12 @@ static bool mlx5_eswitch_offload_is_uplink_port(const struct mlx5_eswitch *esw,

bool
mlx5_eswitch_termtbl_required(struct mlx5_eswitch *esw,
			      struct mlx5_esw_flow_attr *attr,
			      struct mlx5_flow_act *flow_act,
			      struct mlx5_flow_spec *spec)
{
	if (!MLX5_CAP_ESW_FLOWTABLE_FDB(esw->dev, termination_table))
	if (!MLX5_CAP_ESW_FLOWTABLE_FDB(esw->dev, termination_table) ||
	    attr->flags & MLX5_ESW_ATTR_FLAG_SLOW_PATH)
		return false;

	/* push vlan on RX */