From patchwork Thu Nov 19 01:19:47 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Suanming Mou X-Patchwork-Id: 84343 X-Patchwork-Delegate: rasland@nvidia.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id B591DA04DD; Thu, 19 Nov 2020 02:19:58 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 606A0C8BC; Thu, 19 Nov 2020 02:19:56 +0100 (CET) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by dpdk.org (Postfix) with ESMTP id 05707C872 for ; Thu, 19 Nov 2020 02:19:54 +0100 (CET) Received: from Internal Mail-Server by MTLPINE1 (envelope-from suanmingm@nvidia.com) with SMTP; 19 Nov 2020 03:19:52 +0200 Received: from nvidia.com (mtbc-r640-04.mtbc.labs.mlnx [10.75.70.9]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 0AJ1Jn9a009066; Thu, 19 Nov 2020 03:19:49 +0200 From: Suanming Mou To: viacheslavo@nvidia.com, matan@nvidia.com Cc: dev@dpdk.org, rasland@nvidia.com Date: Thu, 19 Nov 2020 09:19:47 +0800 Message-Id: <1605748787-65361-1-git-send-email-suanmingm@nvidia.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1605493866-14673-1-git-send-email-suanmingm@nvidia.com> References: <1605493866-14673-1-git-send-email-suanmingm@nvidia.com> Subject: [dpdk-dev] [PATCH v2] net/mlx5: fix sample and mirror use incorrect devices 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" The sample and mirror action objects are maintained on the list shared between the ports belonging to the same multiport Infiniband device(between representors). The actions in the NIC steering domains might contain the references to the sub-flow action objects created over the given port. The action deletion might happen in the context of the different port and on the deletion of referenced objects the incorrect port might be specified. To avoid this we should save the port on what the sub-flow actions were created and then use this saved port for sub-flow action release. This commit saves the create device in the sample and mirror actions struct to avoid using the incorrect port device in releasing. Fixes: 19784141692e ("net/mlx5: make sample and mirror action thread safe") Signed-off-by: Suanming Mou Reviewed-by: Jiawei Wang Acked-by: Viacheslav Ovsiienko --- v2: - Commit message updated. --- drivers/net/mlx5/linux/mlx5_os.c | 6 ++---- drivers/net/mlx5/mlx5_flow.h | 2 ++ drivers/net/mlx5/mlx5_flow_dv.c | 14 ++++++++------ 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/drivers/net/mlx5/linux/mlx5_os.c b/drivers/net/mlx5/linux/mlx5_os.c index 4b7fff4..00f793b 100644 --- a/drivers/net/mlx5/linux/mlx5_os.c +++ b/drivers/net/mlx5/linux/mlx5_os.c @@ -250,15 +250,13 @@ flow_dv_push_vlan_remove_cb); /* Init sample action cache list. */ snprintf(s, sizeof(s), "%s_sample_action_cache", sh->ibdev_name); - mlx5_cache_list_init(&sh->sample_action_list, s, 0, - &rte_eth_devices[priv->dev_data->port_id], + mlx5_cache_list_init(&sh->sample_action_list, s, 0, sh, flow_dv_sample_create_cb, flow_dv_sample_match_cb, flow_dv_sample_remove_cb); /* Init dest array action cache list. */ snprintf(s, sizeof(s), "%s_dest_array_cache", sh->ibdev_name); - mlx5_cache_list_init(&sh->dest_array_list, s, 0, - &rte_eth_devices[priv->dev_data->port_id], + mlx5_cache_list_init(&sh->dest_array_list, s, 0, sh, flow_dv_dest_array_create_cb, flow_dv_dest_array_match_cb, flow_dv_dest_array_remove_cb); diff --git a/drivers/net/mlx5/mlx5_flow.h b/drivers/net/mlx5/mlx5_flow.h index bccb973..70fa028 100644 --- a/drivers/net/mlx5/mlx5_flow.h +++ b/drivers/net/mlx5/mlx5_flow.h @@ -563,6 +563,7 @@ struct mlx5_flow_dv_sample_resource { void *verbs_action; /**< Verbs sample action object. */ void **sub_actions; /**< Sample sub-action array. */ }; + struct rte_eth_dev *dev; /**< Device registers the action. */ uint32_t idx; /** Sample object index. */ uint8_t ft_type; /** Flow Table Type */ uint32_t ft_id; /** Flow Table Level */ @@ -584,6 +585,7 @@ struct mlx5_flow_dv_dest_array_resource { uint32_t idx; /** Destination array action object index. */ uint8_t ft_type; /** Flow Table Type */ uint8_t num_of_dest; /**< Number of destination actions. */ + struct rte_eth_dev *dev; /**< Device registers the action. */ void *action; /**< Pointer to the rdma core action. */ struct mlx5_flow_sub_actions_idx sample_idx[MLX5_MAX_DEST_NUM]; /**< Action index resources. */ diff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c index 1f0a2ab..ee3a172 100644 --- a/drivers/net/mlx5/mlx5_flow_dv.c +++ b/drivers/net/mlx5/mlx5_flow_dv.c @@ -8757,6 +8757,7 @@ struct mlx5_cache_entry * goto error; } cache_resource->idx = idx; + cache_resource->dev = dev; return &cache_resource->entry; error: if (cache_resource->ft_type == MLX5DV_FLOW_TABLE_TYPE_FDB && @@ -8919,6 +8920,7 @@ struct mlx5_cache_entry * goto error; } cache_resource->idx = res_idx; + cache_resource->dev = dev; for (idx = 0; idx < resource->num_of_dest; idx++) mlx5_free(dest_attr[idx]); return &cache_resource->entry; @@ -11045,13 +11047,13 @@ struct mlx5_cache_entry * } void -flow_dv_sample_remove_cb(struct mlx5_cache_list *list, +flow_dv_sample_remove_cb(struct mlx5_cache_list *list __rte_unused, struct mlx5_cache_entry *entry) { - struct rte_eth_dev *dev = list->ctx; - struct mlx5_priv *priv = dev->data->dev_private; struct mlx5_flow_dv_sample_resource *cache_resource = container_of(entry, typeof(*cache_resource), entry); + struct rte_eth_dev *dev = cache_resource->dev; + struct mlx5_priv *priv = dev->data->dev_private; if (cache_resource->verbs_action) claim_zero(mlx5_glue->destroy_flow_action @@ -11100,13 +11102,13 @@ struct mlx5_cache_entry * } void -flow_dv_dest_array_remove_cb(struct mlx5_cache_list *list, +flow_dv_dest_array_remove_cb(struct mlx5_cache_list *list __rte_unused, struct mlx5_cache_entry *entry) { - struct rte_eth_dev *dev = list->ctx; - struct mlx5_priv *priv = dev->data->dev_private; struct mlx5_flow_dv_dest_array_resource *cache_resource = container_of(entry, typeof(*cache_resource), entry); + struct rte_eth_dev *dev = cache_resource->dev; + struct mlx5_priv *priv = dev->data->dev_private; uint32_t i = 0; MLX5_ASSERT(cache_resource->action);