From: Jiawei Wang Date: Fri, 9 Apr 2021 12:33:28 +0000 (+0300) Subject: net/mlx5: fix resource release for mirror flow X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=ca5eb60ecd5bcd9d4dfed6972ea991d7ead0e9a3;p=dpdk.git net/mlx5: fix resource release for mirror flow 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 --- diff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c index 4914c7085f..07a0ee5abb 100644 --- a/drivers/net/mlx5/mlx5_flow_dv.c +++ b/drivers/net/mlx5/mlx5_flow_dv.c @@ -10155,24 +10155,8 @@ flow_dv_dest_array_create_cb(struct mlx5_cache_list *list __rte_unused, 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]); } @@ -10542,6 +10526,7 @@ flow_dv_create_action_sample(struct rte_eth_dev *dev, 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++; @@ -10549,6 +10534,7 @@ flow_dv_create_action_sample(struct rte_eth_dev *dev, 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++; @@ -12415,7 +12401,8 @@ flow_dv_fate_resource_release(struct rte_eth_dev *dev, 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);