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;