From: Jason Gunthorpe Date: Fri, 14 Jun 2019 00:46:45 +0000 (-0300) Subject: RDMA/odp: Do not leak dma maps when working with huge pages X-Git-Tag: v5.4-rc1~555^2~113 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=dd82e668892ead6fe97c97eabd7ba28e296052c6;p=platform%2Fkernel%2Flinux-rpi.git 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 Signed-off-by: Doug Ledford --- diff --git a/drivers/infiniband/core/umem_odp.c b/drivers/infiniband/core/umem_odp.c index eb9939d..2a75c6f 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);