From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 2437BA04E0; Wed, 27 Nov 2019 14:36:49 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 1D3AD58C3; Wed, 27 Nov 2019 14:36:48 +0100 (CET) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by dpdk.org (Postfix) with ESMTP id 874F74C9D for ; Wed, 27 Nov 2019 14:36:47 +0100 (CET) Received: from Internal Mail-Server by MTLPINE1 (envelope-from viacheslavo@mellanox.com) with ESMTPS (AES256-SHA encrypted); 27 Nov 2019 15:36:45 +0200 Received: from pegasus11.mtr.labs.mlnx (pegasus11.mtr.labs.mlnx [10.210.16.104]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id xARDajVN002940; Wed, 27 Nov 2019 15:36:45 +0200 Received: from pegasus11.mtr.labs.mlnx (localhost [127.0.0.1]) by pegasus11.mtr.labs.mlnx (8.14.7/8.14.7) with ESMTP id xARDajHr013440; Wed, 27 Nov 2019 13:36:45 GMT Received: (from viacheslavo@localhost) by pegasus11.mtr.labs.mlnx (8.14.7/8.14.7/Submit) id xARDajUK013439; Wed, 27 Nov 2019 13:36:45 GMT X-Authentication-Warning: pegasus11.mtr.labs.mlnx: viacheslavo set sender to viacheslavo@mellanox.com using -f From: Viacheslav Ovsiienko To: dev@dpdk.org Cc: matan@mellanox.com, rasland@mellanox.com, orika@mellanox.com Date: Wed, 27 Nov 2019 13:36:43 +0000 Message-Id: <1574861803-13397-1-git-send-email-viacheslavo@mellanox.com> X-Mailer: git-send-email 1.8.3.1 Subject: [dpdk-dev] [PATCH v2] net/mlx5: fix default mark copy flow X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" 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 --- drivers/net/mlx5/mlx5_defs.h | 1 + drivers/net/mlx5/mlx5_flow.c | 13 +++++++------ 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 @@ uint32_t mlx5_flow_adjust_priority(struct rte_eth_dev *dev, int32_t priority, 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 @@ uint32_t mlx5_flow_adjust_priority(struct rte_eth_dev *dev, int32_t priority, } /* * 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 @@ uint32_t mlx5_flow_adjust_priority(struct rte_eth_dev *dev, int32_t priority, /* 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 @@ uint32_t mlx5_flow_adjust_priority(struct rte_eth_dev *dev, int32_t priority, !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; -- 1.8.3.1