Skip to contentSkip to conversation

restore tunnel offload functionality in mlx5

PATCH Superseded Gregory Etelson 2 participants 16 messages Nov 13, 2020 – Nov 15, 2020 Network drivers

v2 of 5 Superseded Latest is v5 →

lore
Share & tools
lore
#0 lore raw

v2 cover restore tunnel offload functionality in mlx5

post merge fixes that restore tunnel offload functionality in mlx5.

v2: resolve compilation error in ubuntu inbox.

Gregory Etelson (5):
net/mlx5: fix tunnel offload object allocation net/mlx5: fix tunnel offload hub multi-thread protection net/mlx5: fix double table referencing net/mlx5: fix tunnel offload callback names net/mlx5: fix non-dv compilation errors

 drivers/net/mlx5/linux/mlx5_os.c |   16 +-
 drivers/net/mlx5/mlx5.c          |   50 +-
 drivers/net/mlx5/mlx5.h          |    4 +-
 drivers/net/mlx5/mlx5_flow.c     | 1296 ++++++++++++++++++------------
 drivers/net/mlx5/mlx5_flow.h     |   23 +-
 drivers/net/mlx5/mlx5_flow_dv.c  |   39 +-
 6 files changed, 842 insertions(+), 586 deletions(-)
Signature · 1 line
2.29.2
#1 lore raw

PATCH v2 1/5 net/mlx5: fix tunnel offload object allocation

The original patch allocated tunnel offload objects with invalid indexes. As the result, PMD tunnel object allocation failed.

In this patch indexed pool provides both an index and memory for a new tunnel offload object.
Also tunnel offload ipool moved to dv enabled code only.

Fixes f2e8093 ("net/mlx5: use indexed pool as id generator")
---
 drivers/net/mlx5/mlx5.c      | 50 ++++++++++++++++++------------------
 drivers/net/mlx5/mlx5.h      |  4 +--
 drivers/net/mlx5/mlx5_flow.c | 41 ++++++++++-------------------
 3 files changed, 40 insertions(+), 55 deletions(-)
drivers/net/mlx5/mlx5.c +25 -25
index 43344391df..e1faa819a3 100644
@@ -186,7 +186,7 @@ static pthread_mutex_t mlx5_dev_ctx_list_mutex = PTHREAD_MUTEX_INITIALIZER;
 
 static const struct mlx5_indexed_pool_config mlx5_ipool_cfg[] = {
 #ifdef HAVE_IBV_FLOW_DV_SUPPORT
-	{
+	[MLX5_IPOOL_DECAP_ENCAP] = {
 		.size = sizeof(struct mlx5_flow_dv_encap_decap_resource),
 		.trunk_size = 64,
 		.grow_trunk = 3,
@@ -197,7 +197,7 @@ static const struct mlx5_indexed_pool_config mlx5_ipool_cfg[] = {
 		.free = mlx5_free,
 		.type = "mlx5_encap_decap_ipool",
 	},
-	{
+	[MLX5_IPOOL_PUSH_VLAN] = {
 		.size = sizeof(struct mlx5_flow_dv_push_vlan_action_resource),
 		.trunk_size = 64,
 		.grow_trunk = 3,
@@ -208,7 +208,7 @@ static const struct mlx5_indexed_pool_config mlx5_ipool_cfg[] = {
 		.free = mlx5_free,
 		.type = "mlx5_push_vlan_ipool",
 	},
-	{
+	[MLX5_IPOOL_TAG] = {
 		.size = sizeof(struct mlx5_flow_dv_tag_resource),
 		.trunk_size = 64,
 		.grow_trunk = 3,
@@ -219,7 +219,7 @@ static const struct mlx5_indexed_pool_config mlx5_ipool_cfg[] = {
 		.free = mlx5_free,
 		.type = "mlx5_tag_ipool",
 	},
-	{
+	[MLX5_IPOOL_PORT_ID] = {
 		.size = sizeof(struct mlx5_flow_dv_port_id_action_resource),
 		.trunk_size = 64,
 		.grow_trunk = 3,
@@ -230,7 +230,7 @@ static const struct mlx5_indexed_pool_config mlx5_ipool_cfg[] = {
 		.free = mlx5_free,
 		.type = "mlx5_port_id_ipool",
 	},
-	{
+	[MLX5_IPOOL_JUMP] = {
 		.size = sizeof(struct mlx5_flow_tbl_data_entry),
 		.trunk_size = 64,
 		.grow_trunk = 3,
@@ -241,7 +241,7 @@ static const struct mlx5_indexed_pool_config mlx5_ipool_cfg[] = {
 		.free = mlx5_free,
 		.type = "mlx5_jump_ipool",
 	},
-	{
+	[MLX5_IPOOL_SAMPLE] = {
 		.size = sizeof(struct mlx5_flow_dv_sample_resource),
 		.trunk_size = 64,
 		.grow_trunk = 3,
@@ -252,7 +252,7 @@ static const struct mlx5_indexed_pool_config mlx5_ipool_cfg[] = {
 		.free = mlx5_free,
 		.type = "mlx5_sample_ipool",
 	},
-	{
+	[MLX5_IPOOL_DEST_ARRAY] = {
 		.size = sizeof(struct mlx5_flow_dv_dest_array_resource),
 		.trunk_size = 64,
 		.grow_trunk = 3,
@@ -263,8 +263,19 @@ static const struct mlx5_indexed_pool_config mlx5_ipool_cfg[] = {
 		.free = mlx5_free,
 		.type = "mlx5_dest_array_ipool",
 	},
+	[MLX5_IPOOL_TUNNEL_OFFLOAD] = {
+		.size = sizeof(struct mlx5_flow_tunnel),
+		.need_lock = 1,
+		.release_mem_en = 1,
+		.type = "mlx5_tunnel_offload",
+	},
+	[MLX5_IPOOL_TUNNEL_FLOW_TBL_ID] = {
+		.size = 0,
+		.need_lock = 1,
+		.type = "mlx5_flow_tnl_tbl_ipool",
+	},
 #endif
-	{
+	[MLX5_IPOOL_MTR] = {
 		.size = sizeof(struct mlx5_flow_meter),
 		.trunk_size = 64,
 		.grow_trunk = 3,
@@ -275,7 +286,7 @@ static const struct mlx5_indexed_pool_config mlx5_ipool_cfg[] = {
 		.free = mlx5_free,
 		.type = "mlx5_meter_ipool",
 	},
-	{
+	[MLX5_IPOOL_MCP] = {
 		.size = sizeof(struct mlx5_flow_mreg_copy_resource),
 		.trunk_size = 64,
 		.grow_trunk = 3,
@@ -286,7 +297,7 @@ static const struct mlx5_indexed_pool_config mlx5_ipool_cfg[] = {
 		.free = mlx5_free,
 		.type = "mlx5_mcp_ipool",
 	},
-	{
+	[MLX5_IPOOL_HRXQ] = {
 		.size = (sizeof(struct mlx5_hrxq) + MLX5_RSS_HASH_KEY_LEN),
 		.trunk_size = 64,
 		.grow_trunk = 3,
@@ -297,7 +308,7 @@ static const struct mlx5_indexed_pool_config mlx5_ipool_cfg[] = {
 		.free = mlx5_free,
 		.type = "mlx5_hrxq_ipool",
 	},
-	{
+	[MLX5_IPOOL_MLX5_FLOW] = {
 		/*
 		 * MLX5_IPOOL_MLX5_FLOW size varies for DV and VERBS flows.
 		 * It set in run time according to PCI function configuration.
@@ -312,7 +323,7 @@ static const struct mlx5_indexed_pool_config mlx5_ipool_cfg[] = {
 		.free = mlx5_free,
 		.type = "mlx5_flow_handle_ipool",
 	},
-	{
+	[MLX5_IPOOL_RTE_FLOW] = {
 		.size = sizeof(struct rte_flow),
 		.trunk_size = 4096,
 		.need_lock = 1,
@@ -321,22 +332,12 @@ static const struct mlx5_indexed_pool_config mlx5_ipool_cfg[] = {
 		.free = mlx5_free,
 		.type = "rte_flow_ipool",
 	},
-	{
+	[MLX5_IPOOL_RSS_EXPANTION_FLOW_ID] = {
 		.size = 0,
 		.need_lock = 1,
 		.type = "mlx5_flow_rss_id_ipool",
 	},
-	{
-		.size = 0,
-		.need_lock = 1,
-		.type = "mlx5_flow_tnl_flow_ipool",
-	},
-	{
-		.size = 0,
-		.need_lock = 1,
-		.type = "mlx5_flow_tnl_tbl_ipool",
-	},
-	{
+	[MLX5_IPOOL_RSS_SHARED_ACTIONS] = {
 		.size = sizeof(struct mlx5_shared_action_rss),
 		.trunk_size = 64,
 		.grow_trunk = 3,
@@ -347,7 +348,6 @@ static const struct mlx5_indexed_pool_config mlx5_ipool_cfg[] = {
 		.free = mlx5_free,
 		.type = "mlx5_shared_action_rss",
 	},
-
 };
 
 
drivers/net/mlx5/mlx5.h +2 -2
index 7ee63a7a14..af097d6a7e 100644
@@ -44,6 +44,8 @@ enum mlx5_ipool_index {
 	MLX5_IPOOL_JUMP, /* Pool for jump resource. */
 	MLX5_IPOOL_SAMPLE, /* Pool for sample resource. */
 	MLX5_IPOOL_DEST_ARRAY, /* Pool for destination array resource. */
+	MLX5_IPOOL_TUNNEL_OFFLOAD, /* Pool for tunnel offload context */
+	MLX5_IPOOL_TUNNEL_FLOW_TBL_ID, /* Pool for tunnel table ID. */
 #endif
 	MLX5_IPOOL_MTR, /* Pool for meter resource. */
 	MLX5_IPOOL_MCP, /* Pool for metadata resource. */
@@ -51,8 +53,6 @@ enum mlx5_ipool_index {
 	MLX5_IPOOL_MLX5_FLOW, /* Pool for mlx5 flow handle. */
 	MLX5_IPOOL_RTE_FLOW, /* Pool for rte_flow. */
 	MLX5_IPOOL_RSS_EXPANTION_FLOW_ID, /* Pool for Queue/RSS flow ID. */
-	MLX5_IPOOL_TUNNEL_ID, /* Pool for flow tunnel ID. */
-	MLX5_IPOOL_TNL_TBL_ID, /* Pool for tunnel table ID. */
 	MLX5_IPOOL_RSS_SHARED_ACTIONS, /* Pool for RSS shared actions. */
 	MLX5_IPOOL_MAX,
 };
drivers/net/mlx5/mlx5_flow.c +13 -28

85 lines not on this page · raw message

Signature · 1 line
2.29.2
#2 lore raw

Re: [dpdk-dev] [PATCH v2 1/5] net/mlx5: fix tunnel offload object allocation

13/11/2020 15:52, Gregory Etelson:

Quoted 10 lines

The original patch allocated tunnel offload objects with invalid indexes. As the result, PMD tunnel object allocation failed.

In this patch indexed pool provides both an index and memory for a new tunnel offload object.
Also tunnel offload ipool moved to dv enabled code only.

Fixes f2e8093 ("net/mlx5: use indexed pool as id generator")

Typo above

Quoted 1 line

This patch is breaking compilation in non-DV mode. You should move it at the end of this series, after moving all in DV areas.

#3 lore raw

Re: [dpdk-dev] [PATCH v2 1/5] net/mlx5: fix tunnel offload object allocation

Quoted 12 lines

13/11/2020 15:52, Gregory Etelson:

Quoted 10 lines

The original patch allocated tunnel offload objects with invalid indexes. As the result, PMD tunnel object allocation failed.

In this patch indexed pool provides both an index and memory for a new tunnel offload object.
Also tunnel offload ipool moved to dv enabled code only.

Fixes f2e8093 ("net/mlx5: use indexed pool as id generator")
Quoted 7 lines

Typo above

Quoted 1 line

This patch is breaking compilation in non-DV mode.
You should move it at the end of this series, after moving all in DV areas.

Patch "[PATCH v2 5/5] net/mlx5: fix non-dv compilation errors" in that series resolves the compilation error.
To restore tunnel offload functionality all 5 patches must be applied.

#4 lore raw

Re: [dpdk-dev] [PATCH v2 1/5] net/mlx5: fix tunnel offload object allocation

14/11/2020 18:47, Gregory Etelson:

Quoted 16 lines
Quoted 16 lines

13/11/2020 15:52, Gregory Etelson:

Quoted 10 lines

The original patch allocated tunnel offload objects with invalid indexes. As the result, PMD tunnel object allocation failed.

In this patch indexed pool provides both an index and memory for a new tunnel offload object.
Also tunnel offload ipool moved to dv enabled code only.

Fixes f2e8093 ("net/mlx5: use indexed pool as id generator")

Typo above

Quoted 1 line
Quoted 7 lines
Quoted 3 lines

This patch is breaking compilation in non-DV mode.
You should move it at the end of this series, after moving all in DV areas.

Patch "[PATCH v2 5/5] net/mlx5: fix non-dv compilation errors" in that series resolves the compilation error.
To restore tunnel offload functionality all 5 patches must be applied.

All patches must compile.
That's why I recommend moving this patch later in the series.

#5 lore raw

PATCH v2 2/5 net/mlx5: fix tunnel offload hub multi-thread protection

In reply to Gregory Etelson

The original patch was removing active tunnel offload objects from a tunnels db list without checking its reference counter value. That action was leading to a PMD crash.

Current patch isolates tunnels db list into a separate API. That API manages MT protection of the tunnel offload db.

Fixes e4f5880 ("net/mlx5: make tunnel hub list thread safe")
---
 drivers/net/mlx5/mlx5_flow.c | 256 +++++++++++++++++++++++++----------
 drivers/net/mlx5/mlx5_flow.h |   6 +-
 2 files changed, 192 insertions(+), 70 deletions(-)
drivers/net/mlx5/mlx5_flow.c +187 -69
index 31c9d82b4a..2f01e34033 100644
@@ -33,6 +33,14 @@
 #include "mlx5_common_os.h"
 #include "rte_pmd_mlx5.h"
 
+static bool
+mlx5_access_tunnel_offload_db
+	(struct rte_eth_dev *dev,
+	 bool (*match)(struct rte_eth_dev *,
+		       struct mlx5_flow_tunnel *, const void *),
+	 void (*hit)(struct rte_eth_dev *, struct mlx5_flow_tunnel *, void *),
+	 void (*miss)(struct rte_eth_dev *, void *),
+	 void *ctx, bool lock_op);
 static struct mlx5_flow_tunnel *
 mlx5_find_tunnel_id(struct rte_eth_dev *dev, uint32_t id);
 static void
@@ -661,29 +669,68 @@ mlx5_flow_tunnel_match(struct rte_eth_dev *dev,
 	return 0;
 }
 
+struct tunnel_db_element_release_ctx {
+	struct rte_flow_item *items;
+	struct rte_flow_action *actions;
+	uint32_t num_elements;
+	struct rte_flow_error *error;
+	int ret;
+};
+
+static bool
+tunnel_element_release_match(struct rte_eth_dev *dev,
+			     struct mlx5_flow_tunnel *tunnel, const void *x)
+{
+	const struct tunnel_db_element_release_ctx *ctx = x;
+
+	RTE_SET_USED(dev);
+	if (ctx->num_elements != 1)
+		return false;
+	else if (ctx->items)
+		return ctx->items == &tunnel->item;
+	else if (ctx->actions)
+		return ctx->actions == &tunnel->action;
+
+	return false;
+}
+
+static void
+tunnel_element_release_hit(struct rte_eth_dev *dev,
+			   struct mlx5_flow_tunnel *tunnel, void *x)
+{
+	struct tunnel_db_element_release_ctx *ctx = x;
+	ctx->ret = 0;
+	if (!__atomic_sub_fetch(&tunnel->refctn, 1, __ATOMIC_RELAXED))
+		mlx5_flow_tunnel_free(dev, tunnel);
+}
+
+static void
+tunnel_element_release_miss(struct rte_eth_dev *dev, void *x)
+{
+	struct tunnel_db_element_release_ctx *ctx = x;
+	RTE_SET_USED(dev);
+	ctx->ret = rte_flow_error_set(ctx->error, EINVAL,
+				      RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
+				      "invalid argument");
+}
+
 static int
 mlx5_flow_item_release(struct rte_eth_dev *dev,
 		       struct rte_flow_item *pmd_items,
 		       uint32_t num_items, struct rte_flow_error *err)
 {
-	struct mlx5_flow_tunnel_hub *thub = mlx5_tunnel_hub(dev);
-	struct mlx5_flow_tunnel *tun;
+	struct tunnel_db_element_release_ctx ctx = {
+		.items = pmd_items,
+		.actions = NULL,
+		.num_elements = num_items,
+		.error = err,
+	};
 
-	rte_spinlock_lock(&thub->sl);
-	LIST_FOREACH(tun, &thub->tunnels, chain) {
-		if (&tun->item == pmd_items) {
-			LIST_REMOVE(tun, chain);
-			break;
-		}
-	}
-	rte_spinlock_unlock(&thub->sl);
-	if (!tun || num_items != 1)
-		return rte_flow_error_set(err, EINVAL,
-					  RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
-					  "invalid argument");
-	if (!__atomic_sub_fetch(&tun->refctn, 1, __ATOMIC_RELAXED))
-		mlx5_flow_tunnel_free(dev, tun);
-	return 0;
+	mlx5_access_tunnel_offload_db(dev, tunnel_element_release_match,
+				      tunnel_element_release_hit,
+				      tunnel_element_release_miss, &ctx, false);
+
+	return ctx.ret;
 }
 
 static int
@@ -691,25 +738,18 @@ mlx5_flow_action_release(struct rte_eth_dev *dev,
 			 struct rte_flow_action *pmd_actions,
 			 uint32_t num_actions, struct rte_flow_error *err)
 {
-	struct mlx5_flow_tunnel_hub *thub = mlx5_tunnel_hub(dev);
-	struct mlx5_flow_tunnel *tun;
+	struct tunnel_db_element_release_ctx ctx = {
+		.items = NULL,
+		.actions = pmd_actions,
+		.num_elements = num_actions,
+		.error = err,
+	};
 
-	rte_spinlock_lock(&thub->sl);
-	LIST_FOREACH(tun, &thub->tunnels, chain) {
-		if (&tun->action == pmd_actions) {
-			LIST_REMOVE(tun, chain);
-			break;
-		}
-	}
-	rte_spinlock_unlock(&thub->sl);
-	if (!tun || num_actions != 1)
-		return rte_flow_error_set(err, EINVAL,
-					  RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
-					  "invalid argument");
-	if (!__atomic_sub_fetch(&tun->refctn, 1, __ATOMIC_RELAXED))
-		mlx5_flow_tunnel_free(dev, tun);
+	mlx5_access_tunnel_offload_db(dev, tunnel_element_release_match,
+				      tunnel_element_release_hit,
+				      tunnel_element_release_miss, &ctx, false);
 
-	return 0;
+	return ctx.ret;
 }
 
 static int
@@ -5889,11 +5929,8 @@ flow_list_destroy(struct rte_eth_dev *dev, uint32_t *list,
 	if (flow->tunnel) {
 		struct mlx5_flow_tunnel *tunnel;
 
-		rte_spinlock_lock(&mlx5_tunnel_hub(dev)->sl);
 		tunnel = mlx5_find_tunnel_id(dev, flow->tunnel_id);
 		RTE_VERIFY(tunnel);
-		LIST_REMOVE(tunnel, chain);
-		rte_spinlock_unlock(&mlx5_tunnel_hub(dev)->sl);
 		if (!__atomic_sub_fetch(&tunnel->refctn, 1, __ATOMIC_RELAXED))
 			mlx5_flow_tunnel_free(dev, tunnel);
 	}
@@ -7464,28 +7501,87 @@ static void
 mlx5_flow_tunnel_free(struct rte_eth_dev *dev,
 		      struct mlx5_flow_tunnel *tunnel)
 {
+	/* no tunnel hub spinlock protection */
 	struct mlx5_priv *priv = dev->data->dev_private;
+	struct mlx5_flow_tunnel_hub *thub = mlx5_tunnel_hub(dev);
 	struct mlx5_indexed_pool *ipool;
 
 	DRV_LOG(DEBUG, "port %u release pmd tunnel id=0x%x",
 		dev->data->port_id, tunnel->tunnel_id);
+	rte_spinlock_lock(&thub->sl);
+	LIST_REMOVE(tunnel, chain);
+	rte_spinlock_unlock(&thub->sl);
 	mlx5_hlist_destroy(tunnel->groups);
 	ipool = priv->sh->ipool[MLX5_IPOOL_TUNNEL_OFFLOAD];
 	mlx5_ipool_free(ipool, tunnel->tunnel_id);
 }
 
-static struct mlx5_flow_tunnel *
-mlx5_find_tunnel_id(struct rte_eth_dev *dev, uint32_t id)
+static bool
+mlx5_access_tunnel_offload_db
+	(struct rte_eth_dev *dev,
+	 bool (*match)(struct rte_eth_dev *,
+		       struct mlx5_flow_tunnel *, const void *),
+	 void (*hit)(struct rte_eth_dev *, struct mlx5_flow_tunnel *, void *),
+	 void (*miss)(struct rte_eth_dev *, void *),
+	 void *ctx, bool lock_op)
 {
+	bool verdict = false;
 	struct mlx5_flow_tunnel_hub *thub = mlx5_tunnel_hub(dev);
-	struct mlx5_flow_tunnel *tun;
+	struct mlx5_flow_tunnel *tunnel;
 
-	LIST_FOREACH(tun, &thub->tunnels, chain) {
-		if (tun->tunnel_id == id)
+	rte_spinlock_lock(&thub->sl);
+	LIST_FOREACH(tunnel, &thub->tunnels, chain) {
+		verdict = match(dev, tunnel, (const void *)ctx);
+		if (verdict)
 			break;
 	}
+	if (!lock_op)
+		rte_spinlock_unlock(&thub->sl);
+	if (verdict && hit)
+		hit(dev, tunnel, ctx);
+	if (!verdict && miss)
+		miss(dev, ctx);
+	if (lock_op)
+		rte_spinlock_unlock(&thub->sl);
 
-	return tun;
+	return verdict;
+}
+
+struct tunnel_db_find_tunnel_id_ctx {
+	uint32_t tunnel_id;
+	struct mlx5_flow_tunnel *tunnel;
+};
+
+static bool
+find_tunnel_id_match(struct rte_eth_dev *dev,
+		     struct mlx5_flow_tunnel *tunnel, const void *x)
+{
+	const struct tunnel_db_find_tunnel_id_ctx *ctx = x;
+
+	RTE_SET_USED(dev);
+	return tunnel->tunnel_id == ctx->tunnel_id;
+}
+
+static void
+find_tunnel_id_hit(struct rte_eth_dev *dev,
+		   struct mlx5_flow_tunnel *tunnel, void *x)
+{
+	struct tunnel_db_find_tunnel_id_ctx *ctx = x;
+	RTE_SET_USED(dev);
+	ctx->tunnel = tunnel;
+}
+
+static struct mlx5_flow_tunnel *
+mlx5_find_tunnel_id(struct rte_eth_dev *dev, uint32_t id)
+{
+	struct tunnel_db_find_tunnel_id_ctx ctx = {
+		.tunnel_id = id,
+	};
+
+	mlx5_access_tunnel_offload_db(dev, find_tunnel_id_match,
+				      find_tunnel_id_hit, NULL, &ctx, true);
+
+	return ctx.tunnel;
 }
 
 static struct mlx5_flow_tunnel *
@@ -7533,38 +7629,60 @@ mlx5_flow_tunnel_allocate(struct rte_eth_dev *dev,
 	return tunnel;
 }
 
+struct tunnel_db_get_tunnel_ctx {
+	const struct rte_flow_tunnel *app_tunnel;
+	struct mlx5_flow_tunnel *tunnel;
+};
+
+static bool get_tunnel_match(struct rte_eth_dev *dev,
+			     struct mlx5_flow_tunnel *tunnel, const void *x)
+{
+	const struct tunnel_db_get_tunnel_ctx *ctx = x;
+
+	RTE_SET_USED(dev);
+	return !memcmp(ctx->app_tunnel, &tunnel->app_tunnel,
+		       sizeof(*ctx->app_tunnel));
+}
+
+static void get_tunnel_hit(struct rte_eth_dev *dev,
+			   struct mlx5_flow_tunnel *tunnel, void *x)
+{
+	/* called under tunnel spinlock protection */
+	struct tunnel_db_get_tunnel_ctx *ctx = x;
+
+	RTE_SET_USED(dev);
+	tunnel->refctn++;
+	ctx->tunnel = tunnel;
+}
+
+static void get_tunnel_miss(struct rte_eth_dev *dev, void *x)
+{
+	/* called under tunnel spinlock protection */
+	struct mlx5_flow_tunnel_hub *thub = mlx5_tunnel_hub(dev);
+	struct tunnel_db_get_tunnel_ctx *ctx = x;
+
+	rte_spinlock_unlock(&thub->sl);
+	ctx->tunnel = mlx5_flow_tunnel_allocate(dev, ctx->app_tunnel);
+	ctx->tunnel->refctn = 1;
+	rte_spinlock_lock(&thub->sl);
+	if (ctx->tunnel)
+		LIST_INSERT_HEAD(&thub->tunnels, ctx->tunnel, chain);
+}
+
+
 static int
 mlx5_get_flow_tunnel(struct rte_eth_dev *dev,
 		     const struct rte_flow_tunnel *app_tunnel,
 		     struct mlx5_flow_tunnel **tunnel)
 {
-	int ret;
-	struct mlx5_flow_tunnel_hub *thub = mlx5_tunnel_hub(dev);
-	struct mlx5_flow_tunnel *tun;
-
-	rte_spinlock_lock(&thub->sl);
-	LIST_FOREACH(tun, &thub->tunnels, chain) {
-		if (!memcmp(app_tunnel, &tun->app_tunnel,
-			    sizeof(*app_tunnel))) {
-			*tunnel = tun;
-			ret = 0;
-			break;
-		}
-	}
-	if (!tun) {
-		tun = mlx5_flow_tunnel_allocate(dev, app_tunnel);
-		if (tun) {
-			LIST_INSERT_HEAD(&thub->tunnels, tun, chain);
-			*tunnel = tun;
-		} else {
-			ret = -ENOMEM;
-		}
-	}
-	rte_spinlock_unlock(&thub->sl);
-	if (tun)
-		__atomic_add_fetch(&tun->refctn, 1, __ATOMIC_RELAXED);
+	struct tunnel_db_get_tunnel_ctx ctx = {
+		.app_tunnel = app_tunnel,
+	};
 
-	return ret;
+	mlx5_access_tunnel_offload_db(dev, get_tunnel_match, get_tunnel_hit,
+				      get_tunnel_miss, &ctx, true);
+	*tunnel = ctx.tunnel;
+	return ctx.tunnel ? 0 : -ENOMEM;
 }
 
 void mlx5_release_tunnel_hub(struct mlx5_dev_ctx_shared *sh, uint16_t port_id)
drivers/net/mlx5/mlx5_flow.h +5 -1
index e3a5030785..bdf2c50090 100644
@@ -950,8 +950,12 @@ struct mlx5_flow_tunnel {
 
 /** PMD tunnel related context */
 struct mlx5_flow_tunnel_hub {
+	/* Tunnels list
+	 * Access to the list MUST be MT protected
+	 */
 	LIST_HEAD(, mlx5_flow_tunnel) tunnels;
-	rte_spinlock_t sl;			/* Tunnel list spinlock. */
+	 /* protect access to the tunnels list */
+	rte_spinlock_t sl;
 	struct mlx5_hlist *groups;		/** non tunnel groups */
 };
 
Signature · 1 line
2.29.2
#6 lore raw

PATCH v2 3/5 net/mlx5: fix double table referencing

In reply to Gregory Etelson

The new flow table resource management API triggered a PMD crash in tunnel offload mode, when tunnel match flow rule was inserted before tunnel set rule.

Reason for the crash was double flow table registration. The table was registered by the tunnel offload code for the first time and once more by PMD code, as part of general table processing. The table counter was decremented only once during the rule destruction and caused a resource leak that triggered the crash.

The patch updates PMD registration with tunnel offload parameters and removes table registration in tunnel related code.

Fixes 663ad57dabb2 ("net/mlx5: make flow table cache thread safe")
---
 drivers/net/mlx5/mlx5_flow.c    | 16 ++++++++++----
 drivers/net/mlx5/mlx5_flow_dv.c | 39 +++++++++++++++++----------------
 2 files changed, 32 insertions(+), 23 deletions(-)
drivers/net/mlx5/mlx5_flow.c +12 -4
index 2f01e34033..185b4ba51a 100644
@@ -7024,7 +7024,15 @@ tunnel_flow_group_to_flow_table(struct rte_eth_dev *dev,
 	struct mlx5_hlist *group_hash;
 
 	group_hash = tunnel ? tunnel->groups : thub->groups;
-	he = mlx5_hlist_register(group_hash, key.val, NULL);
+	he = mlx5_hlist_lookup(group_hash, key.val, NULL);
+	if (!he) {
+		DRV_LOG(DEBUG, "port %u tunnel %u group=%u - generate table id",
+		dev->data->port_id, key.tunnel_id, group);
+		he = mlx5_hlist_register(group_hash, key.val, NULL);
+	} else {
+		DRV_LOG(DEBUG, "port %u tunnel %u group=%u - skip table id",
+		dev->data->port_id, key.tunnel_id, group);
+	}
 	if (!he)
 		return rte_flow_error_set(error, EINVAL,
 					  RTE_FLOW_ERROR_TYPE_ATTR_GROUP,
@@ -7032,8 +7040,8 @@ tunnel_flow_group_to_flow_table(struct rte_eth_dev *dev,
 					  "tunnel group index not supported");
 	tte = container_of(he, typeof(*tte), hash);
 	*table = tte->flow_table;
-	DRV_LOG(DEBUG, "port %u tunnel %u group=%#x table=%#x",
-		dev->data->port_id, key.tunnel_id, group, *table);
+	DRV_LOG(DEBUG, "port %u tunnel %u group=%u table=%u",
+	dev->data->port_id, key.tunnel_id, group, *table);
 	return 0;
 }
 
@@ -7114,7 +7122,7 @@ mlx5_flow_group_to_table(struct rte_eth_dev *dev,
 		standard_translation = true;
 	}
 	DRV_LOG(DEBUG,
-		"port %u group=%#x transfer=%d external=%d fdb_def_rule=%d translate=%s",
+		"port %u group=%u transfer=%d external=%d fdb_def_rule=%d translate=%s",
 		dev->data->port_id, group, grp_info.transfer,
 		grp_info.external, grp_info.fdb_def_rule,
 		standard_translation ? "STANDARD" : "TUNNEL");
drivers/net/mlx5/mlx5_flow_dv.c +20 -19
index 78c710fef9..95165980f4 100644
@@ -8042,6 +8042,8 @@ flow_dv_tbl_resource_get(struct rte_eth_dev *dev,
 				   "cannot get table");
 		return NULL;
 	}
+	DRV_LOG(DEBUG, "Table_id %u tunnel %u group %u registered.",
+		table_id, tunnel ? tunnel->tunnel_id : 0, group_id);
 	tbl_data = container_of(entry, struct mlx5_flow_tbl_data_entry, entry);
 	return &tbl_data->tbl;
 }
@@ -8080,7 +8082,7 @@ flow_dv_tbl_remove_cb(struct mlx5_hlist *list,
 		if (he)
 			mlx5_hlist_unregister(tunnel_grp_hash, he);
 		DRV_LOG(DEBUG,
-			"Table_id %#x tunnel %u group %u released.",
+			"Table_id %u tunnel %u group %u released.",
 			table_id,
 			tbl_data->tunnel ?
 			tbl_data->tunnel->tunnel_id : 0,
@@ -8192,6 +8194,8 @@ flow_dv_matcher_register(struct rte_eth_dev *dev,
 			 struct mlx5_flow_dv_matcher *ref,
 			 union mlx5_flow_tbl_key *key,
 			 struct mlx5_flow *dev_flow,
+			 const struct mlx5_flow_tunnel *tunnel,
+			 uint32_t group_id,
 			 struct rte_flow_error *error)
 {
 	struct mlx5_cache_entry *entry;
@@ -8203,8 +8207,14 @@ flow_dv_matcher_register(struct rte_eth_dev *dev,
 		.data = ref,
 	};
 
-	tbl = flow_dv_tbl_resource_get(dev, key->table_id, key->direction,
-				       key->domain, false, NULL, 0, 0, error);
+	/**
+	 * tunnel offload API requires this registration for cases when
+	 * tunnel match rule was inserted before tunnel set rule.
+	 */
+	tbl = flow_dv_tbl_resource_get(dev, key->table_id,
+				       key->direction, key->domain,
+				       dev_flow->external, tunnel,
+				       group_id, 0, error);
 	if (!tbl)
 		return -rte_errno;	/* No need to refill the error info */
 	tbl_data = container_of(tbl, struct mlx5_flow_tbl_data_entry, tbl);
@@ -9605,10 +9615,14 @@ flow_dv_translate(struct rte_eth_dev *dev,
 		/*
 		 * do not add decap action if match rule drops packet
 		 * HW rejects rules with decap & drop
+		 *
+		 * if tunnel match rule was inserted before matching tunnel set
+		 * rule flow table used in the match rule must be registered.
+		 * current implementation handles that in the
+		 * flow_dv_match_register() at the function end.
 		 */
 		bool add_decap = true;
 		const struct rte_flow_action *ptr = actions;
-		struct mlx5_flow_tbl_resource *tbl;
 
 		for (; ptr->type != RTE_FLOW_ACTION_TYPE_END; ptr++) {
 			if (ptr->type == RTE_FLOW_ACTION_TYPE_DROP) {
@@ -9625,20 +9639,6 @@ flow_dv_translate(struct rte_eth_dev *dev,
 					dev_flow->dv.encap_decap->action;
 			action_flags |= MLX5_FLOW_ACTION_DECAP;
 		}
-		/*
-		 * bind table_id with <group, table> for tunnel match rule.
-		 * Tunnel set rule establishes that bind in JUMP action handler.
-		 * Required for scenario when application creates tunnel match
-		 * rule before tunnel set rule.
-		 */
-		tbl = flow_dv_tbl_resource_get(dev, table, attr->egress,
-					       attr->transfer,
-					       !!dev_flow->external, tunnel,
-					       attr->group, 0, error);
-		if (!tbl)
-			return rte_flow_error_set
-			       (error, EINVAL, RTE_FLOW_ERROR_TYPE_ACTION,
-			       actions, "cannot register tunnel group");
 	}
 	for (; !actions_end ; actions++) {
 		const struct rte_flow_action_queue *queue;
@@ -10468,7 +10468,8 @@ flow_dv_translate(struct rte_eth_dev *dev,
 	tbl_key.domain = attr->transfer;
 	tbl_key.direction = attr->egress;
 	tbl_key.table_id = dev_flow->dv.group;
-	if (flow_dv_matcher_register(dev, &matcher, &tbl_key, dev_flow, error))
+	if (flow_dv_matcher_register(dev, &matcher, &tbl_key, dev_flow,
+				     tunnel, attr->group, error))
 		return -rte_errno;
 	return 0;
 }
Signature · 1 line
2.29.2
#7 lore raw

PATCH v2 4/5 net/mlx5: fix tunnel offload callback names

In reply to Gregory Etelson

Fix mlx5_flow_tunnel_action_release and mlx5_flow_tunnel_item_release callback names to match tunnel offload names pattern.

Fixes 4ec6360de37d ("net/mlx5: implement tunnel offload")
---
 drivers/net/mlx5/mlx5_flow.c | 17 +++++++++--------
 1 file changed, 9 insertions(+), 8 deletions(-)
drivers/net/mlx5/mlx5_flow.c +9 -8
index 185b4ba51a..358a5f4e72 100644
@@ -715,9 +715,9 @@ tunnel_element_release_miss(struct rte_eth_dev *dev, void *x)
 }
 
 static int
-mlx5_flow_item_release(struct rte_eth_dev *dev,
-		       struct rte_flow_item *pmd_items,
-		       uint32_t num_items, struct rte_flow_error *err)
+mlx5_flow_tunnel_item_release(struct rte_eth_dev *dev,
+			      struct rte_flow_item *pmd_items,
+			      uint32_t num_items, struct rte_flow_error *err)
 {
 	struct tunnel_db_element_release_ctx ctx = {
 		.items = pmd_items,
@@ -734,9 +734,10 @@ mlx5_flow_item_release(struct rte_eth_dev *dev,
 }
 
 static int
-mlx5_flow_action_release(struct rte_eth_dev *dev,
-			 struct rte_flow_action *pmd_actions,
-			 uint32_t num_actions, struct rte_flow_error *err)
+mlx5_flow_tunnel_action_release(struct rte_eth_dev *dev,
+				struct rte_flow_action *pmd_actions,
+				uint32_t num_actions,
+				struct rte_flow_error *err)
 {
 	struct tunnel_db_element_release_ctx ctx = {
 		.items = NULL,
@@ -800,8 +801,8 @@ static const struct rte_flow_ops mlx5_flow_ops = {
 	.shared_action_query = mlx5_shared_action_query,
 	.tunnel_decap_set = mlx5_flow_tunnel_decap_set,
 	.tunnel_match = mlx5_flow_tunnel_match,
-	.tunnel_action_decap_release = mlx5_flow_action_release,
-	.tunnel_item_release = mlx5_flow_item_release,
+	.tunnel_action_decap_release = mlx5_flow_tunnel_action_release,
+	.tunnel_item_release = mlx5_flow_tunnel_item_release,
 	.get_restore_info = mlx5_flow_tunnel_get_restore_info,
 };
 
Signature · 1 line
2.29.2
#8 lore raw

PATCH v2 5/5 net/mlx5: fix non-dv compilation errors

In reply to Gregory Etelson

ipools used for tunnel offload are restricted to dv enabled code only since 1d1248d452ff, while the rest of the tunnel offload API did not have compilation limitations. As the results, PMD compilation failed on non-dv setups.

Current patch groups tunnel offload code in dv enabled code area and provides stubs for calls that have to be visible in non-dv environment. These stabs will notify caller that tunnel offload functionality is not supported on that setup.

Fixes 1d1248d452ff ("net/mlx5: fix offloaded tunnel allocation")
---
 drivers/net/mlx5/linux/mlx5_os.c |   16 +-
 drivers/net/mlx5/mlx5_flow.c     | 1104 +++++++++++++++++-------------
 drivers/net/mlx5/mlx5_flow.h     |   17 +-
 3 files changed, 638 insertions(+), 499 deletions(-)
drivers/net/mlx5/linux/mlx5_os.c +10 -6
index c78d56fae3..1aee481bd7 100644
@@ -301,6 +301,12 @@ mlx5_alloc_shared_dr(struct mlx5_priv *priv)
 		goto error;
 	}
 	sh->encaps_decaps->ctx = sh;
+	if (!sh->tunnel_hub)
+		err = mlx5_alloc_tunnel_hub(sh);
+	if (err) {
+		DRV_LOG(ERR, "mlx5_alloc_tunnel_hub failed err=%d", err);
+		goto error;
+	}
 #endif
 #ifdef HAVE_MLX5DV_DR
 	void *domain;
@@ -335,12 +341,6 @@ mlx5_alloc_shared_dr(struct mlx5_priv *priv)
 		sh->esw_drop_action = mlx5_glue->dr_create_flow_action_drop();
 	}
 #endif
-	if (!sh->tunnel_hub)
-		err = mlx5_alloc_tunnel_hub(sh);
-	if (err) {
-		DRV_LOG(ERR, "mlx5_alloc_tunnel_hub failed err=%d", err);
-		goto error;
-	}
 	if (priv->config.reclaim_mode == MLX5_RCM_AGGR) {
 		mlx5_glue->dr_reclaim_domain_memory(sh->rx_domain, 1);
 		mlx5_glue->dr_reclaim_domain_memory(sh->tx_domain, 1);
@@ -389,10 +389,12 @@ mlx5_alloc_shared_dr(struct mlx5_priv *priv)
 		mlx5_hlist_destroy(sh->tag_table);
 		sh->tag_table = NULL;
 	}
+#ifdef HAVE_IBV_FLOW_DV_SUPPORT
 	if (sh->tunnel_hub) {
 		mlx5_release_tunnel_hub(sh, priv->dev_port);
 		sh->tunnel_hub = NULL;
 	}
+#endif /* HAVE_IBV_FLOW_DV_SUPPORT */
 	mlx5_free_table_hash_list(priv);
 	return err;
 }
@@ -451,10 +453,12 @@ mlx5_os_free_shared_dr(struct mlx5_priv *priv)
 		mlx5_hlist_destroy(sh->tag_table);
 		sh->tag_table = NULL;
 	}
+#ifdef HAVE_IBV_FLOW_DV_SUPPORT
 	if (sh->tunnel_hub) {
 		mlx5_release_tunnel_hub(sh, priv->dev_port);
 		sh->tunnel_hub = NULL;
 	}
+#endif /* HAVE_IBV_FLOW_DV_SUPPORT */
 	mlx5_cache_list_destroy(&sh->port_id_action_list);
 	mlx5_cache_list_destroy(&sh->push_vlan_action_list);
 	mlx5_free_table_hash_list(priv);
drivers/net/mlx5/mlx5_flow.c +623 -481

1,197 lines not on this page · raw message

drivers/net/mlx5/mlx5_flow.h +5 -12
index bdf2c50090..672c27ecb9 100644
@@ -965,18 +965,6 @@ struct tunnel_tbl_entry {
 	uint32_t flow_table;
 };
 
-static inline uint32_t
-tunnel_id_to_flow_tbl(uint32_t id)
-{
-	return id | (1u << 16);
-}
-
-static inline uint32_t
-tunnel_flow_tbl_to_id(uint32_t flow_tbl)
-{
-	return flow_tbl & ~(1u << 16);
-}
-
 union tunnel_tbl_key {
 	uint64_t val;
 	struct {
@@ -995,8 +983,13 @@ mlx5_tunnel_hub(struct rte_eth_dev *dev)
 static inline bool
 is_tunnel_offload_active(struct rte_eth_dev *dev)
 {
+#ifdef HAVE_IBV_FLOW_DV_SUPPORT
 	struct mlx5_priv *priv = dev->data->dev_private;
 	return !!priv->config.dv_miss_info;
+#else
+	RTE_SET_USED(dev);
+	return false;
+#endif
 }
 
 static inline bool
Signature · 1 line
2.29.2
#9 lore raw

Re: [dpdk-dev] [PATCH v2 5/5] net/mlx5: fix non-dv compilation errors

13/11/2020 15:52, Gregory Etelson:

drivers/net/mlx5/mlx5_flow.c mlx5_access_tunnel_offload_db · line 7255

Quoted 2 lines
drivers/net/mlx5/mlx5_flow.c +2 -0
+       ret = mlx5_flow_group_to_table(dev, tunnel, jump_data->group,
+                                      &flow_table, grp_info, error);

The parameter grp_info is a struct passed as value. I believe it should be passed as a pointer.

I see some other functions are passing arrays with [] syntax, which does not make sense in parameters. I should be a simple pointer.

Matan, Slava, as maintainers, what are your policies in mlx5 code?

#10 lore raw

Re: [dpdk-dev] [PATCH v2 5/5] net/mlx5: fix non-dv compilation errors

Quoted 6 lines

13/11/2020 15:52, Gregory Etelson:

drivers/net/mlx5/mlx5_flow.c mlx5_access_tunnel_offload_db · line 7255

Quoted 2 lines
drivers/net/mlx5/mlx5_flow.c +2 -0
+       ret = mlx5_flow_group_to_table(dev, tunnel, jump_data->group,
+                                      &flow_table, grp_info, error);

The parameter grp_info is a struct passed as value. I believe it should be passed as a pointer.

struct flow_grp_info is a 64 bit-field:

struct flow_grp_info {
	uint64_t external:1;
	uint64_t transfer:1;
	uint64_t fdb_def_rule:1;
	/* force standard group translation */
	uint64_t std_tbl_fix:1;
	uint64_t skip_scale:1;
};

Since mlx5_flow_group_to_table() does not change bits configuration, there is no need to pass this type as a pointer.

Quoted 4 lines

I see some other functions are passing arrays with [] syntax, which does not make sense in parameters. I should be a simple pointer.

I agree that arrays should not be passed with [] syntax. However, I kept existing rte flow style - see rte_flow_create

Quoted 2 lines

Matan, Slava, as maintainers, what are your policies in mlx5 code?

#11 lore raw

Re: [dpdk-dev] [PATCH v2 5/5] net/mlx5: fix non-dv compilation errors

14/11/2020 18:41, Gregory Etelson:

Quoted 16 lines
Quoted 6 lines

13/11/2020 15:52, Gregory Etelson:

drivers/net/mlx5/mlx5_flow.c mlx5_access_tunnel_offload_db · line 7255

Quoted 2 lines
drivers/net/mlx5/mlx5_flow.c +2 -0
+       ret = mlx5_flow_group_to_table(dev, tunnel, jump_data->group,
+                                      &flow_table, grp_info, error);

The parameter grp_info is a struct passed as value. I believe it should be passed as a pointer.

struct flow_grp_info is a 64 bit-field:

struct flow_grp_info {
	uint64_t external:1;
	uint64_t transfer:1;
	uint64_t fdb_def_rule:1;
	/* force standard group translation */
	uint64_t std_tbl_fix:1;
	uint64_t skip_scale:1;
};
Quoted 2 lines

Since mlx5_flow_group_to_table() does not change bits configuration, there is no need to pass this type as a pointer.

I feel passing struct as pointer is a better practice.

Quoted 5 lines
Quoted 2 lines

I see some other functions are passing arrays with [] syntax, which does not make sense in parameters. I should be a simple pointer.

I agree that arrays should not be passed with [] syntax. However, I kept existing rte flow style - see rte_flow_create

I recommend not following this bad code style.
Later other occurences should be fixed.

Quoted 1 line
Quoted 1 line

Matan, Slava, as maintainers, what are your policies in mlx5 code?

#12 lore raw

Re: [dpdk-dev] [PATCH v2 5/5] net/mlx5: fix non-dv compilation errors

Quoted 22 lines

14/11/2020 18:41, Gregory Etelson:

Quoted 18 lines
Quoted 2 lines

13/11/2020 15:52, Gregory Etelson:

Quoted 1 line

+ ret = mlx5_flow_group_to_table(dev, tunnel, jump_data-

group,

Quoted 5 lines
Quoted 2 lines

+ &flow_table, grp_info,
+ error);

The parameter grp_info is a struct passed as value. I believe it should be passed as a pointer.

struct flow_grp_info is a 64 bit-field:

struct flow_grp_info {
      uint64_t external:1;
      uint64_t transfer:1;
      uint64_t fdb_def_rule:1;
      /* force standard group translation */
      uint64_t std_tbl_fix:1;
      uint64_t skip_scale:1;
};
Quoted 2 lines

Since mlx5_flow_group_to_table() does not change bits configuration, there is no need to pass this type as a pointer.

Quoted 2 lines

I feel passing struct as pointer is a better practice.

The parameter in question is 64 bit unsigned long value. Structure coating is a syntactic sugar, because
C language does not have bit-field types.
In general, if structure size does not exceed 64 bit it can be passed by value.
Passing it by reference would create unnecessary indirect access.

Quoted 12 lines
Quoted 5 lines
Quoted 2 lines

I see some other functions are passing arrays with [] syntax, which does not make sense in parameters. I should be a simple pointer.

I agree that arrays should not be passed with [] syntax. However, I kept existing rte flow style - see rte_flow_create

I recommend not following this bad code style.
Later other occurences should be fixed.

Quoted 1 line
Quoted 1 line

Matan, Slava, as maintainers, what are your policies in mlx5 code?

#13 lore raw

Re: [dpdk-dev] [PATCH v2 5/5] net/mlx5: fix non-dv compilation errors

14/11/2020 19:31, Gregory Etelson:

Quoted 22 lines
Quoted 22 lines

14/11/2020 18:41, Gregory Etelson:

Quoted 20 lines
Quoted 2 lines

13/11/2020 15:52, Gregory Etelson:

Quoted 1 line

+ ret = mlx5_flow_group_to_table(dev, tunnel, jump_data-

group,

Quoted 5 lines
Quoted 2 lines

+ &flow_table, grp_info,
+ error);

The parameter grp_info is a struct passed as value. I believe it should be passed as a pointer.

struct flow_grp_info is a 64 bit-field:

struct flow_grp_info {
      uint64_t external:1;
      uint64_t transfer:1;
      uint64_t fdb_def_rule:1;
      /* force standard group translation */
      uint64_t std_tbl_fix:1;
      uint64_t skip_scale:1;
};

Since mlx5_flow_group_to_table() does not change bits configuration, there is no need to pass this type as a pointer.

Quoted 8 lines
Quoted 1 line

I feel passing struct as pointer is a better practice.

The parameter in question is 64 bit unsigned long value. Structure coating is a syntactic sugar, because
C language does not have bit-field types.
In general, if structure size does not exceed 64 bit it can be passed by value.
Passing it by reference would create unnecessary indirect access.

Did you measure a performance difference?

This current code triggers this compiler note:
drivers/net/mlx5/mlx5_flow.c:7106:1: note:
parameter passing for argument of type 'struct flow_grp_info' changed in GCC 9.1

I'm afraid it can be a problem.
In general we don't have such note on the whole DPDK code base.

#14 lore raw

Re: [dpdk-dev] [PATCH v2 5/5] net/mlx5: fix non-dv compilation errors

Quoted 34 lines

14/11/2020 19:31, Gregory Etelson:

Quoted 22 lines
Quoted 22 lines

14/11/2020 18:41, Gregory Etelson:

Quoted 20 lines
Quoted 2 lines

13/11/2020 15:52, Gregory Etelson:

Quoted 1 line

+ ret = mlx5_flow_group_to_table(dev, tunnel, jump_data-

group,

Quoted 5 lines
Quoted 2 lines

+ &flow_table, grp_info,
+ error);

The parameter grp_info is a struct passed as value. I believe it should be passed as a pointer.

struct flow_grp_info is a 64 bit-field:

struct flow_grp_info {
      uint64_t external:1;
      uint64_t transfer:1;
      uint64_t fdb_def_rule:1;
      /* force standard group translation */
      uint64_t std_tbl_fix:1;
      uint64_t skip_scale:1;
};

Since mlx5_flow_group_to_table() does not change bits configuration, there is no need to pass this type as a pointer.

Quoted 8 lines
Quoted 1 line

I feel passing struct as pointer is a better practice.

The parameter in question is 64 bit unsigned long value. Structure coating is a syntactic sugar, because C language does not have bit-field types.
In general, if structure size does not exceed 64 bit it can be passed by value.
Passing it by reference would create unnecessary indirect access.

Did you measure a performance difference?

Quoted 8 lines

This current code triggers this compiler note:
drivers/net/mlx5/mlx5_flow.c:7106:1: note:
parameter passing for argument of type 'struct flow_grp_info' changed in GCC 9.1

I'm afraid it can be a problem.
In general we don't have such note on the whole DPDK code base.

I'll handle this issue in DV compilation patch.

#15 lore raw
In reply to Gregory Etelson

13/11/2020 15:52, Gregory Etelson:

Quoted 3 lines

post merge fixes that restore tunnel offload functionality in mlx5.

v2: resolve compilation error in ubuntu inbox.

Please use --in-reply-to to keep all versions threaded.