mirror of
https://github.com/torvalds/linux.git
synced 2024-12-25 12:21:37 +00:00
IB/mlx5: Don't clean uninitialized UMR resources
In case we failed to create UMR resources, mark them as invalid so we
won't try to destroy them on the unwind path.
Add the relevant checks to destroy_umrc_res(), this is done for the
unlikely event ib_register_device() or create_umr_res() err out and we
try to destroy invalid objects.
Fixes: 42cea83f95
("IB/mlx5: Fix cleanup order on unload")
Signed-off-by: Mark Bloch <markb@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
This commit is contained in:
parent
e8980d67d6
commit
32927e281c
@ -3448,9 +3448,12 @@ static void destroy_umrc_res(struct mlx5_ib_dev *dev)
|
|||||||
if (err)
|
if (err)
|
||||||
mlx5_ib_warn(dev, "mr cache cleanup failed\n");
|
mlx5_ib_warn(dev, "mr cache cleanup failed\n");
|
||||||
|
|
||||||
mlx5_ib_destroy_qp(dev->umrc.qp);
|
if (dev->umrc.qp)
|
||||||
ib_free_cq(dev->umrc.cq);
|
mlx5_ib_destroy_qp(dev->umrc.qp);
|
||||||
ib_dealloc_pd(dev->umrc.pd);
|
if (dev->umrc.cq)
|
||||||
|
ib_free_cq(dev->umrc.cq);
|
||||||
|
if (dev->umrc.pd)
|
||||||
|
ib_dealloc_pd(dev->umrc.pd);
|
||||||
}
|
}
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
@ -3552,12 +3555,15 @@ static int create_umr_res(struct mlx5_ib_dev *dev)
|
|||||||
|
|
||||||
error_4:
|
error_4:
|
||||||
mlx5_ib_destroy_qp(qp);
|
mlx5_ib_destroy_qp(qp);
|
||||||
|
dev->umrc.qp = NULL;
|
||||||
|
|
||||||
error_3:
|
error_3:
|
||||||
ib_free_cq(cq);
|
ib_free_cq(cq);
|
||||||
|
dev->umrc.cq = NULL;
|
||||||
|
|
||||||
error_2:
|
error_2:
|
||||||
ib_dealloc_pd(pd);
|
ib_dealloc_pd(pd);
|
||||||
|
dev->umrc.pd = NULL;
|
||||||
|
|
||||||
error_0:
|
error_0:
|
||||||
kfree(attr);
|
kfree(attr);
|
||||||
|
@ -739,6 +739,9 @@ int mlx5_mr_cache_cleanup(struct mlx5_ib_dev *dev)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
if (!dev->cache.wq)
|
||||||
|
return 0;
|
||||||
|
|
||||||
dev->cache.stopped = 1;
|
dev->cache.stopped = 1;
|
||||||
flush_workqueue(dev->cache.wq);
|
flush_workqueue(dev->cache.wq);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user