From patchwork Fri Apr 9 12:33:28 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiawei Wang X-Patchwork-Id: 90975 X-Patchwork-Delegate: rasland@nvidia.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 033C9A0579; Fri, 9 Apr 2021 14:33:34 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id B1F58140F50; Fri, 9 Apr 2021 14:33:34 +0200 (CEST) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by mails.dpdk.org (Postfix) with ESMTP id 4E44E4014D for ; Fri, 9 Apr 2021 14:33:32 +0200 (CEST) Received: from Internal Mail-Server by MTLPINE1 (envelope-from jiaweiw@nvidia.com) with SMTP; 9 Apr 2021 15:33:28 +0300 Received: from nvidia.com (gen-l-vrt-281.mtl.labs.mlnx [10.237.44.1]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 139CXSks004795; Fri, 9 Apr 2021 15:33:28 +0300 From: Jiawei Wang To: Matan Azrad , Shahaf Shuler , Viacheslav Ovsiienko , Jiawei Wang Cc: dev@dpdk.org, stable@dpdk.org Date: Fri, 9 Apr 2021 15:33:28 +0300 Message-Id: <1617971608-89460-1-git-send-email-jiaweiw@nvidia.com> X-Mailer: git-send-email 1.8.3.1 Subject: [dpdk-dev] [PATCH] net/mlx5: fix resource release issue for mirror flow X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 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 mlx5 PMD allocated the resources of the sample actions, and then moved these ones to the destination actions array. The original indices were not cleared and the resources were referenced twice in the flow object - as the fate actions and in the destination actions array. This causes the failure on flow destroy because PMD tried to release the same objects twice. The patch clears the original indices, add the missed checking for zero and eliminates multiple object releasing. Fixes: 00c10c22118a ("net/mlx5: update translate function for mirroring") Cc: stable@dpdk.org Signed-off-by: Jiawei Wang Reviewed-by: Suanming Mou Acked-by: Viacheslav Ovsiienko --- drivers/net/mlx5/mlx5_flow_dv.c | 25 ++++++------------------- 1 file changed, 6 insertions(+), 19 deletions(-) diff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c index 1818895..883fe2e 100644 --- a/drivers/net/mlx5/mlx5_flow_dv.c +++ b/drivers/net/mlx5/mlx5_flow_dv.c @@ -10148,24 +10148,8 @@ struct mlx5_cache_entry * return &cache_resource->entry; error: for (idx = 0; idx < resource->num_of_dest; idx++) { - struct mlx5_flow_sub_actions_idx *act_res = - &cache_resource->sample_idx[idx]; - if (act_res->rix_hrxq && - !mlx5_hrxq_release(dev, - act_res->rix_hrxq)) - act_res->rix_hrxq = 0; - if (act_res->rix_encap_decap && - !flow_dv_encap_decap_resource_release(dev, - act_res->rix_encap_decap)) - act_res->rix_encap_decap = 0; - if (act_res->rix_port_id_action && - !flow_dv_port_id_action_resource_release(dev, - act_res->rix_port_id_action)) - act_res->rix_port_id_action = 0; - if (act_res->rix_jump && - !flow_dv_jump_tbl_resource_release(dev, - act_res->rix_jump)) - act_res->rix_jump = 0; + flow_dv_sample_sub_actions_release(dev, + &cache_resource->sample_idx[idx]); if (dest_attr[idx]) mlx5_free(dest_attr[idx]); } @@ -10533,6 +10517,7 @@ struct mlx5_cache_entry * dev_flow->handle->dvh.rix_encap_decap; sample_act->dr_encap_action = dev_flow->dv.encap_decap->action; + dev_flow->handle->dvh.rix_encap_decap = 0; } if (sample_act->action_flags & MLX5_FLOW_ACTION_PORT_ID) { normal_idx++; @@ -10540,6 +10525,7 @@ struct mlx5_cache_entry * dev_flow->handle->rix_port_id_action; sample_act->dr_port_id_action = dev_flow->dv.port_id_action->action; + dev_flow->handle->rix_port_id_action = 0; } if (sample_act->action_flags & MLX5_FLOW_ACTION_JUMP) { normal_idx++; @@ -12406,7 +12392,8 @@ struct mlx5_cache_entry * return; switch (handle->fate_action) { case MLX5_FLOW_FATE_QUEUE: - mlx5_hrxq_release(dev, handle->rix_hrxq); + if (!handle->dvh.rix_sample && !handle->dvh.rix_dest_array) + mlx5_hrxq_release(dev, handle->rix_hrxq); break; case MLX5_FLOW_FATE_JUMP: flow_dv_jump_tbl_resource_release(dev, handle->rix_jump);