summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorViacheslav Ovsiienko <viacheslavo@mellanox.com>2019-11-27 13:36:43 +0000
committerThomas Monjalon <thomas@monjalon.net>2019-11-27 16:15:10 +0100
commita0865f6f074880a2270f937d385070d1ae726bdf (patch)
tree020c1e7d52638575a3d68dd41e3a44528619b275
parent20bbb9e0450f2ccda374584173dc0a5cd93c9f06 (diff)
downloaddpdk-a0865f6f074880a2270f937d385070d1ae726bdf.zip
dpdk-a0865f6f074880a2270f937d385070d1ae726bdf.tar.gz
dpdk-a0865f6f074880a2270f937d385070d1ae726bdf.tar.xz
net/mlx5: fix default mark copy flow
In extensive metadata mode the MARK copy table is engaged, if the application creates the flow with zero MARK ID action: flow create 1 ingress pattern eth / ... / end actions mark id 0 / .. end And then destroys that, the traffic to the port stops. This happens due to default flow for the copy table has the zero ID and is removed with the application rule. The patch extends internal ID variable to 64 bits and provide the UINT64_MAX ID for the copy table default rule. Fixes: dd3c774f6ffb ("net/mlx5: add metadata register copy table") Signed-off-by: Viacheslav Ovsiienko <viacheslavo@mellanox.com> Acked-by: Ori Kam <orika@mellanox.com>
-rw-r--r--drivers/net/mlx5/mlx5_defs.h1
-rw-r--r--drivers/net/mlx5/mlx5_flow.c13
2 files changed, 8 insertions, 6 deletions
diff --git a/drivers/net/mlx5/mlx5_defs.h b/drivers/net/mlx5/mlx5_defs.h
index 9e113c5..042e1f3 100644
--- a/drivers/net/mlx5/mlx5_defs.h
+++ b/drivers/net/mlx5/mlx5_defs.h
@@ -174,6 +174,7 @@
/* Size of the simple hash table for metadata register table. */
#define MLX5_FLOW_MREG_HTABLE_SZ 4096
#define MLX5_FLOW_MREG_HNAME "MARK_COPY_TABLE"
+#define MLX5_DEFAULT_COPY_ID UINT32_MAX
/* Definition of static_assert found in /usr/include/assert.h */
#ifndef HAVE_STATIC_ASSERT
diff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c
index 5c78ea7..0087163 100644
--- a/drivers/net/mlx5/mlx5_flow.c
+++ b/drivers/net/mlx5/mlx5_flow.c
@@ -2947,16 +2947,16 @@ flow_mreg_add_copy_action(struct rte_eth_dev *dev, uint32_t mark_id,
mcp_res = (void *)mlx5_hlist_lookup(priv->mreg_cp_tbl, mark_id);
if (mcp_res) {
/* For non-default rule. */
- if (mark_id)
+ if (mark_id != MLX5_DEFAULT_COPY_ID)
mcp_res->refcnt++;
- assert(mark_id || mcp_res->refcnt == 1);
+ assert(mark_id != MLX5_DEFAULT_COPY_ID || mcp_res->refcnt == 1);
return mcp_res;
}
/* Provide the full width of FLAG specific value. */
if (mark_id == (priv->sh->dv_regc0_mask & MLX5_FLOW_MARK_DEFAULT))
tag_spec.data = MLX5_FLOW_MARK_DEFAULT;
/* Build a new flow. */
- if (mark_id) {
+ if (mark_id != MLX5_DEFAULT_COPY_ID) {
items[0] = (struct rte_flow_item){
.type = MLX5_RTE_FLOW_ITEM_TYPE_TAG,
.spec = &tag_spec,
@@ -3054,7 +3054,7 @@ flow_mreg_del_copy_action(struct rte_eth_dev *dev,
}
/*
* We do not check availability of metadata registers here,
- * because copy resources are allocated in this case.
+ * because copy resources are not allocated in this case.
*/
if (--mcp_res->refcnt)
return;
@@ -3133,7 +3133,8 @@ flow_mreg_del_default_copy_action(struct rte_eth_dev *dev)
/* Check if default flow is registered. */
if (!priv->mreg_cp_tbl)
return;
- mcp_res = (void *)mlx5_hlist_lookup(priv->mreg_cp_tbl, 0ULL);
+ mcp_res = (void *)mlx5_hlist_lookup(priv->mreg_cp_tbl,
+ MLX5_DEFAULT_COPY_ID);
if (!mcp_res)
return;
assert(mcp_res->flow);
@@ -3166,7 +3167,7 @@ flow_mreg_add_default_copy_action(struct rte_eth_dev *dev,
!mlx5_flow_ext_mreg_supported(dev) ||
!priv->sh->dv_regc0_mask)
return 0;
- mcp_res = flow_mreg_add_copy_action(dev, 0, error);
+ mcp_res = flow_mreg_add_copy_action(dev, MLX5_DEFAULT_COPY_ID, error);
if (!mcp_res)
return -rte_errno;
return 0;