patch 'net/mlx5: fix GRE protocol type translation for Verbs' has been queued to stable release 20.11.5
luca.boccassi at gmail.com
luca.boccassi at gmail.com
Fri Feb 18 13:37:49 CET 2022
Hi,
FYI, your patch has been queued to stable release 20.11.5
Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet.
It will be pushed if I get no objections before 02/20/22. So please
shout if anyone has objections.
Also note that after the patch there's a diff of the upstream commit vs the
patch applied to the branch. This will indicate if there was any rebasing
needed to apply to the stable branch. If there were code changes for rebasing
(ie: not only metadata diffs), please double check that the rebase was
correctly done.
Queued patches are on a temporary branch at:
https://github.com/bluca/dpdk-stable
This queued commit can be viewed at:
https://github.com/bluca/dpdk-stable/commit/0374774e882a3a724cb39aac839adf2f483ab478
Thanks.
Luca Boccassi
---
>From 0374774e882a3a724cb39aac839adf2f483ab478 Mon Sep 17 00:00:00 2001
From: Gregory Etelson <getelson at nvidia.com>
Date: Thu, 23 Dec 2021 15:16:38 +0200
Subject: [PATCH] net/mlx5: fix GRE protocol type translation for Verbs
[ upstream commit 985b479267aa90394f1c219de120d23e96761789 ]
When application creates several flows to match on GRE tunnel without
explicitly specifying GRE protocol type value in flow rules, PMD will
translate that to zero mask.
RDMA-CORE cannot distinguish between different inner flow types and
produces identical matchers for each zero mask.
The patch extracts inner header type from flow rule and forces it in
GRE protocol type, if application did not specify any.
Fixes: 84c406e74524 ("net/mlx5: add flow translate function")
Signed-off-by: Gregory Etelson <getelson at nvidia.com>
Acked-by: Matan Azrad <matan at nvidia.com>
---
drivers/net/mlx5/mlx5_flow.h | 14 +++++++++++
drivers/net/mlx5/mlx5_flow_dv.c | 14 -----------
drivers/net/mlx5/mlx5_flow_verbs.c | 37 ++++++++++++++++++++----------
3 files changed, 39 insertions(+), 26 deletions(-)
diff --git a/drivers/net/mlx5/mlx5_flow.h b/drivers/net/mlx5/mlx5_flow.h
index 7d42edaacc..ed5f94a9a0 100644
--- a/drivers/net/mlx5/mlx5_flow.h
+++ b/drivers/net/mlx5/mlx5_flow.h
@@ -1287,6 +1287,20 @@ tunnel_use_standard_attr_group_translate
return verdict;
}
+static inline uint16_t
+mlx5_translate_tunnel_etypes(uint64_t pattern_flags)
+{
+ if (pattern_flags & MLX5_FLOW_LAYER_INNER_L2)
+ return RTE_ETHER_TYPE_TEB;
+ else if (pattern_flags & MLX5_FLOW_LAYER_INNER_L3_IPV4)
+ return RTE_ETHER_TYPE_IPV4;
+ else if (pattern_flags & MLX5_FLOW_LAYER_INNER_L3_IPV6)
+ return RTE_ETHER_TYPE_IPV6;
+ else if (pattern_flags & MLX5_FLOW_LAYER_MPLS)
+ return RTE_ETHER_TYPE_MPLS;
+ return 0;
+}
+
int mlx5_flow_group_to_table(struct rte_eth_dev *dev,
const struct mlx5_flow_tunnel *tunnel,
uint32_t group, uint32_t *table,
diff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c
index 57d8d79286..c134e24c0e 100644
--- a/drivers/net/mlx5/mlx5_flow_dv.c
+++ b/drivers/net/mlx5/mlx5_flow_dv.c
@@ -84,20 +84,6 @@ flow_dv_port_id_action_resource_release(struct rte_eth_dev *dev,
static void
flow_dv_shared_rss_action_release(struct rte_eth_dev *dev, uint32_t srss);
-static inline uint16_t
-mlx5_translate_tunnel_etypes(uint64_t pattern_flags)
-{
- if (pattern_flags & MLX5_FLOW_LAYER_INNER_L2)
- return RTE_ETHER_TYPE_TEB;
- else if (pattern_flags & MLX5_FLOW_LAYER_INNER_L3_IPV4)
- return RTE_ETHER_TYPE_IPV4;
- else if (pattern_flags & MLX5_FLOW_LAYER_INNER_L3_IPV6)
- return RTE_ETHER_TYPE_IPV6;
- else if (pattern_flags & MLX5_FLOW_LAYER_MPLS)
- return RTE_ETHER_TYPE_MPLS;
- return 0;
-}
-
/**
* Initialize flow attributes structure according to flow items' types.
*
diff --git a/drivers/net/mlx5/mlx5_flow_verbs.c b/drivers/net/mlx5/mlx5_flow_verbs.c
index afe973019b..9c2fc1b25e 100644
--- a/drivers/net/mlx5/mlx5_flow_verbs.c
+++ b/drivers/net/mlx5/mlx5_flow_verbs.c
@@ -960,6 +960,7 @@ flow_verbs_translate_item_gre(struct mlx5_flow *dev_flow,
.size = size,
};
#else
+ static const struct rte_flow_item_gre empty_gre = {0,};
const struct rte_flow_item_gre *spec = item->spec;
const struct rte_flow_item_gre *mask = item->mask;
unsigned int size = sizeof(struct ibv_flow_spec_gre);
@@ -968,17 +969,29 @@ flow_verbs_translate_item_gre(struct mlx5_flow *dev_flow,
.size = size,
};
- if (!mask)
- mask = &rte_flow_item_gre_mask;
- if (spec) {
- tunnel.val.c_ks_res0_ver = spec->c_rsvd0_ver;
- tunnel.val.protocol = spec->protocol;
- tunnel.mask.c_ks_res0_ver = mask->c_rsvd0_ver;
- tunnel.mask.protocol = mask->protocol;
- /* Remove unwanted bits from values. */
- tunnel.val.c_ks_res0_ver &= tunnel.mask.c_ks_res0_ver;
+ if (!spec) {
+ spec = &empty_gre;
+ mask = &empty_gre;
+ } else {
+ if (!mask)
+ mask = &rte_flow_item_gre_mask;
+ }
+ tunnel.val.c_ks_res0_ver = spec->c_rsvd0_ver;
+ tunnel.val.protocol = spec->protocol;
+ tunnel.mask.c_ks_res0_ver = mask->c_rsvd0_ver;
+ tunnel.mask.protocol = mask->protocol;
+ /* Remove unwanted bits from values. */
+ tunnel.val.c_ks_res0_ver &= tunnel.mask.c_ks_res0_ver;
+ tunnel.val.key &= tunnel.mask.key;
+ if (tunnel.mask.protocol) {
tunnel.val.protocol &= tunnel.mask.protocol;
- tunnel.val.key &= tunnel.mask.key;
+ } else {
+ tunnel.val.protocol = mlx5_translate_tunnel_etypes(item_flags);
+ if (tunnel.val.protocol) {
+ tunnel.mask.protocol = 0xFFFF;
+ tunnel.val.protocol =
+ rte_cpu_to_be_16(tunnel.val.protocol);
+ }
}
#endif
if (item_flags & MLX5_FLOW_LAYER_OUTER_L3_IPV4)
@@ -1846,8 +1859,6 @@ flow_verbs_translate(struct rte_eth_dev *dev,
item_flags |= MLX5_FLOW_LAYER_VXLAN_GPE;
break;
case RTE_FLOW_ITEM_TYPE_GRE:
- flow_verbs_translate_item_gre(dev_flow, items,
- item_flags);
subpriority = MLX5_TUNNEL_PRIO_GET(rss_desc);
item_flags |= MLX5_FLOW_LAYER_GRE;
break;
@@ -1863,6 +1874,8 @@ flow_verbs_translate(struct rte_eth_dev *dev,
NULL, "item not supported");
}
}
+ if (item_flags & MLX5_FLOW_LAYER_GRE)
+ flow_verbs_translate_item_gre(dev_flow, items, item_flags);
dev_flow->handle->layers = item_flags;
/* Other members of attr will be ignored. */
dev_flow->verbs.attr.priority =
--
2.30.2
---
Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- - 2022-02-18 12:37:38.923842047 +0000
+++ 0020-net-mlx5-fix-GRE-protocol-type-translation-for-Verbs.patch 2022-02-18 12:37:37.554788882 +0000
@@ -1 +1 @@
-From 985b479267aa90394f1c219de120d23e96761789 Mon Sep 17 00:00:00 2001
+From 0374774e882a3a724cb39aac839adf2f483ab478 Mon Sep 17 00:00:00 2001
@@ -5,0 +6,2 @@
+[ upstream commit 985b479267aa90394f1c219de120d23e96761789 ]
+
@@ -16 +17,0 @@
-Cc: stable at dpdk.org
@@ -27 +28 @@
-index 8c131d61ae..125d85899c 100644
+index 7d42edaacc..ed5f94a9a0 100644
@@ -30,2 +31,2 @@
-@@ -1450,6 +1450,20 @@ flow_aso_ct_get_by_idx(struct rte_eth_dev *dev, uint32_t own_idx)
- return ct;
+@@ -1287,6 +1287,20 @@ tunnel_use_standard_attr_group_translate
+ return verdict;
@@ -52 +53 @@
-index 5d9fbffd0e..0383976883 100644
+index 57d8d79286..c134e24c0e 100644
@@ -55,3 +56,3 @@
-@@ -93,20 +93,6 @@ static int
- flow_dv_jump_tbl_resource_release(struct rte_eth_dev *dev,
- uint32_t rix_jump);
+@@ -84,20 +84,6 @@ flow_dv_port_id_action_resource_release(struct rte_eth_dev *dev,
+ static void
+ flow_dv_shared_rss_action_release(struct rte_eth_dev *dev, uint32_t srss);
@@ -73,3 +74,3 @@
- static int16_t
- flow_dv_get_esw_manager_vport_id(struct rte_eth_dev *dev)
- {
+ /**
+ * Initialize flow attributes structure according to flow items' types.
+ *
@@ -77 +78 @@
-index 29cd694752..192a00d4fd 100644
+index afe973019b..9c2fc1b25e 100644
@@ -80 +81 @@
-@@ -907,6 +907,7 @@ flow_verbs_translate_item_gre(struct mlx5_flow *dev_flow,
+@@ -960,6 +960,7 @@ flow_verbs_translate_item_gre(struct mlx5_flow *dev_flow,
@@ -88 +89 @@
-@@ -915,17 +916,29 @@ flow_verbs_translate_item_gre(struct mlx5_flow *dev_flow,
+@@ -968,17 +969,29 @@ flow_verbs_translate_item_gre(struct mlx5_flow *dev_flow,
@@ -128 +129 @@
-@@ -1803,8 +1816,6 @@ flow_verbs_translate(struct rte_eth_dev *dev,
+@@ -1846,8 +1859,6 @@ flow_verbs_translate(struct rte_eth_dev *dev,
@@ -137 +138 @@
-@@ -1820,6 +1831,8 @@ flow_verbs_translate(struct rte_eth_dev *dev,
+@@ -1863,6 +1874,8 @@ flow_verbs_translate(struct rte_eth_dev *dev,
More information about the stable
mailing list