diff options
author | Jason Gunthorpe <jgg@mellanox.com> | 2019-06-13 21:46:45 -0300 |
---|---|---|
committer | Doug Ledford <dledford@redhat.com> | 2019-06-20 21:52:47 -0400 |
commit | dd82e668892ead6fe97c97eabd7ba28e296052c6 (patch) | |
tree | 9c2dd737f9a0fabb72ac219e3948279c78a9c538 | |
parent | d384742ed1afa925bb78fd50ff337538f202f19c (diff) | |
download | linux-dd82e668892ead6fe97c97eabd7ba28e296052c6.tar.bz2 |
RDMA/odp: Do not leak dma maps when working with huge pages
The ib_dma_unmap_page() must match the length of the ib_dma_map_page(),
which is based on odp_shift. Otherwise iommu resources under this API
will not be properly freed.
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
-rw-r--r-- | drivers/infiniband/core/umem_odp.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/infiniband/core/umem_odp.c b/drivers/infiniband/core/umem_odp.c index eb9939d52818..2a75c6f8d827 100644 --- a/drivers/infiniband/core/umem_odp.c +++ b/drivers/infiniband/core/umem_odp.c @@ -730,7 +730,8 @@ void ib_umem_odp_unmap_dma_pages(struct ib_umem_odp *umem_odp, u64 virt, WARN_ON(!dma_addr); - ib_dma_unmap_page(dev, dma_addr, PAGE_SIZE, + ib_dma_unmap_page(dev, dma_addr, + BIT(umem_odp->page_shift), DMA_BIDIRECTIONAL); if (dma & ODP_WRITE_ALLOWED_BIT) { struct page *head_page = compound_head(page); |