diff options
| -rw-r--r-- | drivers/infiniband/hw/mlx5/mr.c | 12 |
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 | ||
| 1664 | int mlx5_ib_dereg_mr(struct ib_mr *ibmr) | 1668 | int mlx5_ib_dereg_mr(struct ib_mr *ibmr) |
