IB/core: Fix ODP get user pages flow
authorYishai Hadas <yishaih@mellanox.com>
Sun, 22 Dec 2019 12:46:48 +0000 (14:46 +0200)
committerJason Gunthorpe <jgg@mellanox.com>
Fri, 3 Jan 2020 21:00:13 +0000 (17:00 -0400)
The nr_pages argument of get_user_pages_remote() should always be in terms
of the system page size, not the MR page size. Use PAGE_SIZE instead of
umem_odp->page_shift.

Fixes: 403cd12e2cf7 ("IB/umem: Add contiguous ODP support")
Link: https://lore.kernel.org/r/20191222124649.52300-3-leon@kernel.org
Signed-off-by: Yishai Hadas <yishaih@mellanox.com>
Reviewed-by: Artemy Kovalyov <artemyko@mellanox.com>
Reviewed-by: Jason Gunthorpe <jgg@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/core/umem_odp.c

index e42d44e..2e9ee7a 100644 (file)
@@ -440,7 +440,7 @@ int ib_umem_odp_map_dma_pages(struct ib_umem_odp *umem_odp, u64 user_virt,
 
        while (bcnt > 0) {
                const size_t gup_num_pages = min_t(size_t,
-                               (bcnt + BIT(page_shift) - 1) >> page_shift,
+                               ALIGN(bcnt, PAGE_SIZE) / PAGE_SIZE,
                                PAGE_SIZE / sizeof(struct page *));
 
                down_read(&owning_mm->mmap_sem);