|
Thomas Bogendoerfer |
caf82a |
From: Chris Mi <cmi@nvidia.com>
|
|
Thomas Bogendoerfer |
caf82a |
Date: Thu, 17 Nov 2022 07:45:45 +0200
|
|
Thomas Bogendoerfer |
caf82a |
Subject: net/mlx5e: Offload rule only when all encaps are valid
|
|
Thomas Bogendoerfer |
caf82a |
Patch-mainline: v6.1-rc7
|
|
Thomas Bogendoerfer |
caf82a |
Git-commit: f377422044b2093c835e5f3717f8c8c58da1db1f
|
|
Thomas Bogendoerfer |
caf82a |
References: jsc#PED-1549
|
|
Thomas Bogendoerfer |
caf82a |
|
|
Thomas Bogendoerfer |
caf82a |
The cited commit adds a for loop to support multiple encapsulations.
|
|
Thomas Bogendoerfer |
caf82a |
But it only checks if the last encap is valid.
|
|
Thomas Bogendoerfer |
caf82a |
|
|
Thomas Bogendoerfer |
caf82a |
Fix it by setting slow path flag when one of the encap is invalid.
|
|
Thomas Bogendoerfer |
caf82a |
|
|
Thomas Bogendoerfer |
caf82a |
Fixes: f493f15534ec ("net/mlx5e: Move flow attr reformat action bit to per dest flags")
|
|
Thomas Bogendoerfer |
caf82a |
Signed-off-by: Chris Mi <cmi@nvidia.com>
|
|
Thomas Bogendoerfer |
caf82a |
Reviewed-by: Roi Dayan <roid@nvidia.com>
|
|
Thomas Bogendoerfer |
caf82a |
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
|
|
Thomas Bogendoerfer |
caf82a |
Acked-by: Thomas Bogendoerfer <tbogendoerfer@suse.de>
|
|
Thomas Bogendoerfer |
caf82a |
---
|
|
Thomas Bogendoerfer |
caf82a |
drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_encap.c | 6 +---
|
|
Thomas Bogendoerfer |
caf82a |
drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_encap.h | 3 --
|
|
Thomas Bogendoerfer |
caf82a |
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | 17 ++++----------
|
|
Thomas Bogendoerfer |
caf82a |
3 files changed, 9 insertions(+), 17 deletions(-)
|
|
Thomas Bogendoerfer |
caf82a |
|
|
Thomas Bogendoerfer |
caf82a |
--- a/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_encap.c
|
|
Thomas Bogendoerfer |
caf82a |
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_encap.c
|
|
Thomas Bogendoerfer |
caf82a |
@@ -764,8 +764,7 @@ int mlx5e_attach_encap(struct mlx5e_priv
|
|
Thomas Bogendoerfer |
caf82a |
struct net_device *mirred_dev,
|
|
Thomas Bogendoerfer |
caf82a |
int out_index,
|
|
Thomas Bogendoerfer |
caf82a |
struct netlink_ext_ack *extack,
|
|
Thomas Bogendoerfer |
caf82a |
- struct net_device **encap_dev,
|
|
Thomas Bogendoerfer |
caf82a |
- bool *encap_valid)
|
|
Thomas Bogendoerfer |
caf82a |
+ struct net_device **encap_dev)
|
|
Thomas Bogendoerfer |
caf82a |
{
|
|
Thomas Bogendoerfer |
caf82a |
struct mlx5_eswitch *esw = priv->mdev->priv.eswitch;
|
|
Thomas Bogendoerfer |
caf82a |
struct mlx5e_tc_flow_parse_attr *parse_attr;
|
|
Thomas Bogendoerfer |
caf82a |
@@ -880,9 +879,8 @@ attach_flow:
|
|
Thomas Bogendoerfer |
caf82a |
if (e->flags & MLX5_ENCAP_ENTRY_VALID) {
|
|
Thomas Bogendoerfer |
caf82a |
attr->esw_attr->dests[out_index].pkt_reformat = e->pkt_reformat;
|
|
Thomas Bogendoerfer |
caf82a |
attr->esw_attr->dests[out_index].flags |= MLX5_ESW_DEST_ENCAP_VALID;
|
|
Thomas Bogendoerfer |
caf82a |
- *encap_valid = true;
|
|
Thomas Bogendoerfer |
caf82a |
} else {
|
|
Thomas Bogendoerfer |
caf82a |
- *encap_valid = false;
|
|
Thomas Bogendoerfer |
caf82a |
+ flow_flag_set(flow, SLOW);
|
|
Thomas Bogendoerfer |
caf82a |
}
|
|
Thomas Bogendoerfer |
caf82a |
mutex_unlock(&esw->offloads.encap_tbl_lock);
|
|
Thomas Bogendoerfer |
caf82a |
|
|
Thomas Bogendoerfer |
caf82a |
--- a/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_encap.h
|
|
Thomas Bogendoerfer |
caf82a |
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_encap.h
|
|
Thomas Bogendoerfer |
caf82a |
@@ -17,8 +17,7 @@ int mlx5e_attach_encap(struct mlx5e_priv
|
|
Thomas Bogendoerfer |
caf82a |
struct net_device *mirred_dev,
|
|
Thomas Bogendoerfer |
caf82a |
int out_index,
|
|
Thomas Bogendoerfer |
caf82a |
struct netlink_ext_ack *extack,
|
|
Thomas Bogendoerfer |
caf82a |
- struct net_device **encap_dev,
|
|
Thomas Bogendoerfer |
caf82a |
- bool *encap_valid);
|
|
Thomas Bogendoerfer |
caf82a |
+ struct net_device **encap_dev);
|
|
Thomas Bogendoerfer |
caf82a |
|
|
Thomas Bogendoerfer |
caf82a |
int mlx5e_attach_decap(struct mlx5e_priv *priv,
|
|
Thomas Bogendoerfer |
caf82a |
struct mlx5e_tc_flow *flow,
|
|
Thomas Bogendoerfer |
caf82a |
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
|
|
Thomas Bogendoerfer |
caf82a |
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
|
|
Thomas Bogendoerfer |
caf82a |
@@ -1634,7 +1634,6 @@ set_encap_dests(struct mlx5e_priv *priv,
|
|
Thomas Bogendoerfer |
caf82a |
struct mlx5e_tc_flow *flow,
|
|
Thomas Bogendoerfer |
caf82a |
struct mlx5_flow_attr *attr,
|
|
Thomas Bogendoerfer |
caf82a |
struct netlink_ext_ack *extack,
|
|
Thomas Bogendoerfer |
caf82a |
- bool *encap_valid,
|
|
Thomas Bogendoerfer |
caf82a |
bool *vf_tun)
|
|
Thomas Bogendoerfer |
caf82a |
{
|
|
Thomas Bogendoerfer |
caf82a |
struct mlx5e_tc_flow_parse_attr *parse_attr;
|
|
Thomas Bogendoerfer |
caf82a |
@@ -1651,7 +1650,6 @@ set_encap_dests(struct mlx5e_priv *priv,
|
|
Thomas Bogendoerfer |
caf82a |
parse_attr = attr->parse_attr;
|
|
Thomas Bogendoerfer |
caf82a |
esw_attr = attr->esw_attr;
|
|
Thomas Bogendoerfer |
caf82a |
*vf_tun = false;
|
|
Thomas Bogendoerfer |
caf82a |
- *encap_valid = true;
|
|
Thomas Bogendoerfer |
caf82a |
|
|
Thomas Bogendoerfer |
caf82a |
for (out_index = 0; out_index < MLX5_MAX_FLOW_FWD_VPORTS; out_index++) {
|
|
Thomas Bogendoerfer |
caf82a |
struct net_device *out_dev;
|
|
Thomas Bogendoerfer |
caf82a |
@@ -1668,7 +1666,7 @@ set_encap_dests(struct mlx5e_priv *priv,
|
|
Thomas Bogendoerfer |
caf82a |
goto out;
|
|
Thomas Bogendoerfer |
caf82a |
}
|
|
Thomas Bogendoerfer |
caf82a |
err = mlx5e_attach_encap(priv, flow, attr, out_dev, out_index,
|
|
Thomas Bogendoerfer |
caf82a |
- extack, &encap_dev, encap_valid);
|
|
Thomas Bogendoerfer |
caf82a |
+ extack, &encap_dev);
|
|
Thomas Bogendoerfer |
caf82a |
dev_put(out_dev);
|
|
Thomas Bogendoerfer |
caf82a |
if (err)
|
|
Thomas Bogendoerfer |
caf82a |
goto out;
|
|
Thomas Bogendoerfer |
caf82a |
@@ -1732,8 +1730,8 @@ mlx5e_tc_add_fdb_flow(struct mlx5e_priv
|
|
Thomas Bogendoerfer |
caf82a |
struct mlx5e_tc_flow_parse_attr *parse_attr;
|
|
Thomas Bogendoerfer |
caf82a |
struct mlx5_flow_attr *attr = flow->attr;
|
|
Thomas Bogendoerfer |
caf82a |
struct mlx5_esw_flow_attr *esw_attr;
|
|
Thomas Bogendoerfer |
caf82a |
- bool vf_tun, encap_valid;
|
|
Thomas Bogendoerfer |
caf82a |
u32 max_prio, max_chain;
|
|
Thomas Bogendoerfer |
caf82a |
+ bool vf_tun;
|
|
Thomas Bogendoerfer |
caf82a |
int err = 0;
|
|
Thomas Bogendoerfer |
caf82a |
|
|
Thomas Bogendoerfer |
caf82a |
parse_attr = attr->parse_attr;
|
|
Thomas Bogendoerfer |
caf82a |
@@ -1823,7 +1821,7 @@ mlx5e_tc_add_fdb_flow(struct mlx5e_priv
|
|
Thomas Bogendoerfer |
caf82a |
esw_attr->int_port = int_port;
|
|
Thomas Bogendoerfer |
caf82a |
}
|
|
Thomas Bogendoerfer |
caf82a |
|
|
Thomas Bogendoerfer |
caf82a |
- err = set_encap_dests(priv, flow, attr, extack, &encap_valid, &vf_tun);
|
|
Thomas Bogendoerfer |
caf82a |
+ err = set_encap_dests(priv, flow, attr, extack, &vf_tun);
|
|
Thomas Bogendoerfer |
caf82a |
if (err)
|
|
Thomas Bogendoerfer |
caf82a |
goto err_out;
|
|
Thomas Bogendoerfer |
caf82a |
|
|
Thomas Bogendoerfer |
caf82a |
@@ -1853,7 +1851,7 @@ mlx5e_tc_add_fdb_flow(struct mlx5e_priv
|
|
Thomas Bogendoerfer |
caf82a |
* (1) there's no error
|
|
Thomas Bogendoerfer |
caf82a |
* (2) there's an encap action and we don't have valid neigh
|
|
Thomas Bogendoerfer |
caf82a |
*/
|
|
Thomas Bogendoerfer |
caf82a |
- if (!encap_valid || flow_flag_test(flow, SLOW))
|
|
Thomas Bogendoerfer |
caf82a |
+ if (flow_flag_test(flow, SLOW))
|
|
Thomas Bogendoerfer |
caf82a |
flow->rule[0] = mlx5e_tc_offload_to_slow_path(esw, flow, &parse_attr->spec);
|
|
Thomas Bogendoerfer |
caf82a |
else
|
|
Thomas Bogendoerfer |
caf82a |
flow->rule[0] = mlx5e_tc_offload_fdb_rules(esw, flow, &parse_attr->spec, attr);
|
|
Thomas Bogendoerfer |
caf82a |
@@ -3759,7 +3757,7 @@ alloc_flow_post_acts(struct mlx5e_tc_flo
|
|
Thomas Bogendoerfer |
caf82a |
struct mlx5e_post_act *post_act = get_post_action(flow->priv);
|
|
Thomas Bogendoerfer |
caf82a |
struct mlx5_flow_attr *attr, *next_attr = NULL;
|
|
Thomas Bogendoerfer |
caf82a |
struct mlx5e_post_act_handle *handle;
|
|
Thomas Bogendoerfer |
caf82a |
- bool vf_tun, encap_valid = true;
|
|
Thomas Bogendoerfer |
caf82a |
+ bool vf_tun;
|
|
Thomas Bogendoerfer |
caf82a |
int err;
|
|
Thomas Bogendoerfer |
caf82a |
|
|
Thomas Bogendoerfer |
caf82a |
/* This is going in reverse order as needed.
|
|
Thomas Bogendoerfer |
caf82a |
@@ -3781,13 +3779,10 @@ alloc_flow_post_acts(struct mlx5e_tc_flo
|
|
Thomas Bogendoerfer |
caf82a |
if (list_is_last(&attr->list, &flow->attrs))
|
|
Thomas Bogendoerfer |
caf82a |
break;
|
|
Thomas Bogendoerfer |
caf82a |
|
|
Thomas Bogendoerfer |
caf82a |
- err = set_encap_dests(flow->priv, flow, attr, extack, &encap_valid, &vf_tun);
|
|
Thomas Bogendoerfer |
caf82a |
+ err = set_encap_dests(flow->priv, flow, attr, extack, &vf_tun);
|
|
Thomas Bogendoerfer |
caf82a |
if (err)
|
|
Thomas Bogendoerfer |
caf82a |
goto out_free;
|
|
Thomas Bogendoerfer |
caf82a |
|
|
Thomas Bogendoerfer |
caf82a |
- if (!encap_valid)
|
|
Thomas Bogendoerfer |
caf82a |
- flow_flag_set(flow, SLOW);
|
|
Thomas Bogendoerfer |
caf82a |
-
|
|
Thomas Bogendoerfer |
caf82a |
err = actions_prepare_mod_hdr_actions(flow->priv, flow, attr, extack);
|
|
Thomas Bogendoerfer |
caf82a |
if (err)
|
|
Thomas Bogendoerfer |
caf82a |
goto out_free;
|