Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma
[platform/kernel/linux-starfive.git] / drivers / infiniband / core / umem.c
index cedd03f..0eb4002 100644 (file)
 
 static void __ib_umem_release(struct ib_device *dev, struct ib_umem *umem, int dirty)
 {
-       struct sg_page_iter sg_iter;
-       struct page *page;
+       bool make_dirty = umem->writable && dirty;
+       struct scatterlist *sg;
+       unsigned int i;
 
        if (umem->nmap > 0)
                ib_dma_unmap_sg(dev, umem->sg_head.sgl, umem->sg_nents,
                                DMA_BIDIRECTIONAL);
 
-       for_each_sg_page(umem->sg_head.sgl, &sg_iter, umem->sg_nents, 0) {
-               page = sg_page_iter_page(&sg_iter);
-               unpin_user_pages_dirty_lock(&page, 1, umem->writable && dirty);
-       }
+       for_each_sg(umem->sg_head.sgl, sg, umem->sg_nents, i)
+               unpin_user_page_range_dirty_lock(sg_page(sg),
+                       DIV_ROUND_UP(sg->length, PAGE_SIZE), make_dirty);
 
        sg_free_table(&umem->sg_head);
 }