Skip to content

Commit

Permalink
net/mlx5: Don't use termination tables in slow path
Browse files Browse the repository at this point in the history
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: Eli Cohen <eli@mellanox.com>
Reviewed-by: Oz Shlomo <ozsh@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
  • Loading branch information
Eli Cohen authored and Saeed Mahameed committed Mar 18, 2020
1 parent b5f814c commit d8a2034
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 7 deletions.
2 changes: 2 additions & 0 deletions drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -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 {
Expand Down
20 changes: 14 additions & 6 deletions drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -495,10 +501,12 @@ __mlx5_eswitch_del_rule(struct mlx5_eswitch *esw,

mlx5_del_flow_rules(rule);

/* 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);
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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down

0 comments on commit d8a2034

Please sign in to comment.