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 5F6CDA04DD; Mon, 16 Nov 2020 03:31:20 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 0D92A31FC; Mon, 16 Nov 2020 03:31:18 +0100 (CET) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by dpdk.org (Postfix) with ESMTP id E6D8F1DB9 for ; Mon, 16 Nov 2020 03:31:15 +0100 (CET) Received: from Internal Mail-Server by MTLPINE1 (envelope-from suanmingm@nvidia.com) with SMTP; 16 Nov 2020 04:31:09 +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 0AG2V7rn017251; Mon, 16 Nov 2020 04:31:08 +0200 From: Suanming Mou To: viacheslavo@nvidia.com, matan@nvidia.com Cc: rasland@nvidia.com, dev@dpdk.org Date: Mon, 16 Nov 2020 10:31:06 +0800 Message-Id: <1605493866-14673-1-git-send-email-suanmingm@nvidia.com> X-Mailer: git-send-email 1.8.3.1 Subject: [dpdk-dev] [PATCH] 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" Currently, sample and mirror actions are added to sh(shared context) level list. The ports belong to the same sh can share the sample and mirror actions. While creating the sample and mirror actions sh list in sh creation, the port which creates sh will be added to the sample and mirror list context. The port device saved in the list context will be used when release the entries in the list. Since mirror and sample actions may have hrxq sub-action which is port level not sh level, in this case, the other ports in the sh which creates the sample and mirror action will use the incorrect port devices to release the hrxq. This commit saves the create device in the sample and mirror actions struct to avoid using the incorrect port device in entry releasing. Fixes: 19784141692e ("net/mlx5: make sample and mirror action thread safe") Signed-off-by: Suanming Mou Reviewed-by: Jiawei Wang --- 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 ce25108..59f37b6 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 5fac867..aa068e9 100644 --- a/drivers/net/mlx5/mlx5_flow.h +++ b/drivers/net/mlx5/mlx5_flow.h @@ -575,6 +575,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 */ @@ -596,6 +597,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 62d9ca9..c38da14 100644 --- a/drivers/net/mlx5/mlx5_flow_dv.c +++ b/drivers/net/mlx5/mlx5_flow_dv.c @@ -8711,6 +8711,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 && @@ -8873,6 +8874,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; @@ -11008,13 +11010,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 @@ -11063,13 +11065,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); -- 1.8.3.1