aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/infiniband/hw/mlx5/mr.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/drivers/infiniband/hw/mlx5/mr.c b/drivers/infiniband/hw/mlx5/mr.c
index 9fb1d9cb9401..e22314837645 100644
--- a/drivers/infiniband/hw/mlx5/mr.c
+++ b/drivers/infiniband/hw/mlx5/mr.c
@@ -544,6 +544,9 @@ void mlx5_mr_cache_free(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr)
544 int shrink = 0; 544 int shrink = 0;
545 int c; 545 int c;
546 546
547 if (!mr->allocated_from_cache)
548 return;
549
547 c = order2idx(dev, mr->order); 550 c = order2idx(dev, mr->order);
548 if (c < 0 || c >= MAX_MR_CACHE_ENTRIES) { 551 if (c < 0 || c >= MAX_MR_CACHE_ENTRIES) {
549 mlx5_ib_warn(dev, "order %d, cache index %d\n", mr->order, c); 552 mlx5_ib_warn(dev, "order %d, cache index %d\n", mr->order, c);
@@ -1647,18 +1650,19 @@ static void dereg_mr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr)
1647 umem = NULL; 1650 umem = NULL;
1648 } 1651 }
1649#endif 1652#endif
1650
1651 clean_mr(dev, mr); 1653 clean_mr(dev, mr);
1652 1654
1655 /*
1656 * We should unregister the DMA address from the HCA before
1657 * remove the DMA mapping.
1658 */
1659 mlx5_mr_cache_free(dev, mr);
1653 if (umem) { 1660 if (umem) {
1654 ib_umem_release(umem); 1661 ib_umem_release(umem);
1655 atomic_sub(npages, &dev->mdev->priv.reg_pages); 1662 atomic_sub(npages, &dev->mdev->priv.reg_pages);
1656 } 1663 }
1657
1658 if (!mr->allocated_from_cache) 1664 if (!mr->allocated_from_cache)
1659 kfree(mr); 1665 kfree(mr);
1660 else
1661 mlx5_mr_cache_free(dev, mr);
1662} 1666}
1663 1667
1664int mlx5_ib_dereg_mr(struct ib_mr *ibmr) 1668int mlx5_ib_dereg_mr(struct ib_mr *ibmr)