Skip to content

Commit 3d82875

Browse files
rleonjgunthorpe
authored andcommitted
RDMA/core: Always release restrack object
Change location of rdma_restrack_del() to fix the bug where task_struct was acquired but not released, causing to resource leak. ucma_create_id() { ucma_alloc_ctx(); rdma_create_user_id() { rdma_restrack_new(); rdma_restrack_set_name() { rdma_restrack_attach_task.part.0(); <--- task_struct was gotten } } ucma_destroy_private_ctx() { ucma_put_ctx(); rdma_destroy_id() { _destroy_id() <--- id_priv was freed } } } Fixes: 889d916 ("RDMA/core: Don't access cm_id after its destruction") Link: https://lore.kernel.org/r/073ec27acb943ca8b6961663c47c5abe78a5c8cc.1624948948.git.leonro@nvidia.com Reported-by: Pavel Skripkin <[email protected]> Signed-off-by: Leon Romanovsky <[email protected]> Signed-off-by: Jason Gunthorpe <[email protected]>
1 parent 4a754d7 commit 3d82875

File tree

1 file changed

+1
-1
lines changed
  • drivers/infiniband/core

1 file changed

+1
-1
lines changed

drivers/infiniband/core/cma.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1837,6 +1837,7 @@ static void _destroy_id(struct rdma_id_private *id_priv,
18371837
{
18381838
cma_cancel_operation(id_priv, state);
18391839

1840+
rdma_restrack_del(&id_priv->res);
18401841
if (id_priv->cma_dev) {
18411842
if (rdma_cap_ib_cm(id_priv->id.device, 1)) {
18421843
if (id_priv->cm_id.ib)
@@ -1846,7 +1847,6 @@ static void _destroy_id(struct rdma_id_private *id_priv,
18461847
iw_destroy_cm_id(id_priv->cm_id.iw);
18471848
}
18481849
cma_leave_mc_groups(id_priv);
1849-
rdma_restrack_del(&id_priv->res);
18501850
cma_release_dev(id_priv);
18511851
}
18521852

0 commit comments

Comments
 (0)