]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
net/mlx5e: Match cleanup order in mlx5e_free_rq in reverse of mlx5e_alloc_rq
authorRahul Rameshbabu <rrameshbabu@nvidia.com>
Wed, 11 Sep 2024 20:17:57 +0000 (13:17 -0700)
committerJakub Kicinski <kuba@kernel.org>
Fri, 13 Sep 2024 03:50:30 +0000 (20:50 -0700)
mlx5e_free_rq previously cleaned resources in an order that was not the
reverse of the resource allocation order in mlx5e_alloc_rq.

Signed-off-by: Rahul Rameshbabu <rrameshbabu@nvidia.com>
Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
Link: https://patch.msgid.link/20240911201757.1505453-16-saeed@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/en_main.c

index 47e7a80d221be8a6497e606e535f65fcb11fec7b..a5659c0c42361323325b49d0e3b30dc2f5b8c8db 100644 (file)
@@ -1016,30 +1016,31 @@ err_rq_xdp_prog:
 
 static void mlx5e_free_rq(struct mlx5e_rq *rq)
 {
-       struct bpf_prog *old_prog;
-
-       if (xdp_rxq_info_is_reg(&rq->xdp_rxq)) {
-               old_prog = rcu_dereference_protected(rq->xdp_prog,
-                                                    lockdep_is_held(&rq->priv->state_lock));
-               if (old_prog)
-                       bpf_prog_put(old_prog);
-       }
+       kvfree(rq->dim);
+       page_pool_destroy(rq->page_pool);
 
        switch (rq->wq_type) {
        case MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ:
+               mlx5e_rq_free_shampo(rq);
                kvfree(rq->mpwqe.info);
                mlx5_core_destroy_mkey(rq->mdev, be32_to_cpu(rq->mpwqe.umr_mkey_be));
                mlx5e_free_mpwqe_rq_drop_page(rq);
-               mlx5e_rq_free_shampo(rq);
                break;
        default: /* MLX5_WQ_TYPE_CYCLIC */
                mlx5e_free_wqe_alloc_info(rq);
        }
 
-       kvfree(rq->dim);
-       xdp_rxq_info_unreg(&rq->xdp_rxq);
-       page_pool_destroy(rq->page_pool);
        mlx5_wq_destroy(&rq->wq_ctrl);
+
+       if (xdp_rxq_info_is_reg(&rq->xdp_rxq)) {
+               struct bpf_prog *old_prog;
+
+               old_prog = rcu_dereference_protected(rq->xdp_prog,
+                                                    lockdep_is_held(&rq->priv->state_lock));
+               if (old_prog)
+                       bpf_prog_put(old_prog);
+       }
+       xdp_rxq_info_unreg(&rq->xdp_rxq);
 }
 
 int mlx5e_create_rq(struct mlx5e_rq *rq, struct mlx5e_rq_param *param, u16 q_counter)