And get rid of the mmap_sem calls, as part of that. Note
that get_user_pages_fast() will, if necessary, fall back to
__gup_longterm_unlocked(), which takes the mmap_sem as needed.

Reviewed-by: Leon Romanovsky <leo...@mellanox.com>
Reviewed-by: Christoph Hellwig <h...@lst.de>
Reviewed-by: Jan Kara <j...@suse.cz>
Reviewed-by: Jason Gunthorpe <j...@mellanox.com>
Reviewed-by: Ira Weiny <ira.we...@intel.com>
Signed-off-by: John Hubbard <jhubb...@nvidia.com>
---
 drivers/infiniband/core/umem.c | 17 ++++++-----------
 1 file changed, 6 insertions(+), 11 deletions(-)

diff --git a/drivers/infiniband/core/umem.c b/drivers/infiniband/core/umem.c
index 7a3b99597ead..214e87aa609d 100644
--- a/drivers/infiniband/core/umem.c
+++ b/drivers/infiniband/core/umem.c
@@ -266,16 +266,13 @@ struct ib_umem *ib_umem_get(struct ib_udata *udata, 
unsigned long addr,
        sg = umem->sg_head.sgl;
 
        while (npages) {
-               down_read(&mm->mmap_sem);
-               ret = get_user_pages(cur_base,
-                                    min_t(unsigned long, npages,
-                                          PAGE_SIZE / sizeof (struct page *)),
-                                    gup_flags | FOLL_LONGTERM,
-                                    page_list, NULL);
-               if (ret < 0) {
-                       up_read(&mm->mmap_sem);
+               ret = get_user_pages_fast(cur_base,
+                                         min_t(unsigned long, npages,
+                                               PAGE_SIZE /
+                                               sizeof(struct page *)),
+                                         gup_flags | FOLL_LONGTERM, page_list);
+               if (ret < 0)
                        goto umem_release;
-               }
 
                cur_base += ret * PAGE_SIZE;
                npages   -= ret;
@@ -283,8 +280,6 @@ struct ib_umem *ib_umem_get(struct ib_udata *udata, 
unsigned long addr,
                sg = ib_umem_add_sg_table(sg, page_list, ret,
                        dma_get_max_seg_size(context->device->dma_device),
                        &umem->sg_nents);
-
-               up_read(&mm->mmap_sem);
        }
 
        sg_mark_end(sg);
-- 
2.24.0

Reply via email to