From 6ed2288ca93479f801f49daf9b6d674701f4c28e Mon Sep 17 00:00:00 2001 From: Al Viro Date: Mon, 30 Jan 2017 22:28:31 -0500 Subject: [PATCH 1/8] vchiq_2835_arm: switch to get_user_pages_fast() Signed-off-by: Al Viro --- .../interface/vchiq_arm/vchiq_2835_arm.c | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c index 0159ca4407d8..cd2b19f335d8 100644 --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c @@ -92,8 +92,7 @@ static irqreturn_t vchiq_doorbell_irq(int irq, void *dev_id); static struct vchiq_pagelist_info * -create_pagelist(char __user *buf, size_t count, unsigned short type, - struct task_struct *task); +create_pagelist(char __user *buf, size_t count, unsigned short type); static void free_pagelist(struct vchiq_pagelist_info *pagelistinfo, @@ -251,8 +250,7 @@ vchiq_prepare_bulk_data(VCHIQ_BULK_T *bulk, VCHI_MEM_HANDLE_T memhandle, pagelistinfo = create_pagelist((char __user *)offset, size, (dir == VCHIQ_BULK_RECEIVE) ? PAGELIST_READ - : PAGELIST_WRITE, - current); + : PAGELIST_WRITE); if (!pagelistinfo) return VCHIQ_ERROR; @@ -391,8 +389,7 @@ cleanup_pagelistinfo(struct vchiq_pagelist_info *pagelistinfo) */ static struct vchiq_pagelist_info * -create_pagelist(char __user *buf, size_t count, unsigned short type, - struct task_struct *task) +create_pagelist(char __user *buf, size_t count, unsigned short type) { PAGELIST_T *pagelist; struct vchiq_pagelist_info *pagelistinfo; @@ -472,14 +469,11 @@ create_pagelist(char __user *buf, size_t count, unsigned short type, } /* do not try and release vmalloc pages */ } else { - down_read(&task->mm->mmap_sem); - actual_pages = get_user_pages( - (unsigned long)buf & PAGE_MASK, + actual_pages = get_user_pages_fast( + (unsigned long)buf & PAGE_MASK, num_pages, - (type == PAGELIST_READ) ? FOLL_WRITE : 0, - pages, - NULL /*vmas */); - up_read(&task->mm->mmap_sem); + type == PAGELIST_READ, + pages); if (actual_pages != num_pages) { vchiq_log_info(vchiq_arm_log_level, From 0ca36a6bbd85bad72596a15e1505483352333c88 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Sun, 29 Jan 2017 03:12:00 -0500 Subject: [PATCH 2/8] rapidio: switch to get_user_pages_fast() Signed-off-by: Al Viro --- drivers/rapidio/devices/rio_mport_cdev.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/drivers/rapidio/devices/rio_mport_cdev.c b/drivers/rapidio/devices/rio_mport_cdev.c index 5beb0c361076..cf8e4ec2fd48 100644 --- a/drivers/rapidio/devices/rio_mport_cdev.c +++ b/drivers/rapidio/devices/rio_mport_cdev.c @@ -889,11 +889,9 @@ rio_dma_transfer(struct file *filp, u32 transfer_mode, goto err_req; } - pinned = get_user_pages_unlocked( + pinned = get_user_pages_fast( (unsigned long)xfer->loc_addr & PAGE_MASK, - nr_pages, - page_list, - dir == DMA_FROM_DEVICE ? FOLL_WRITE : 0); + nr_pages, dir == DMA_FROM_DEVICE, page_list); if (pinned != nr_pages) { if (pinned < 0) { From 1aaa09caedc1d999fb324b4b77a88167bdfc531a Mon Sep 17 00:00:00 2001 From: Al Viro Date: Mon, 30 Jan 2017 02:45:08 -0500 Subject: [PATCH 3/8] fsl_hypervisor: switch to get_user_pages_fast() Signed-off-by: Al Viro --- drivers/virt/fsl_hypervisor.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/virt/fsl_hypervisor.c b/drivers/virt/fsl_hypervisor.c index d993df5586c0..d70ad6d38879 100644 --- a/drivers/virt/fsl_hypervisor.c +++ b/drivers/virt/fsl_hypervisor.c @@ -243,8 +243,8 @@ static long ioctl_memcpy(struct fsl_hv_ioctl_memcpy __user *p) sg_list = PTR_ALIGN(sg_list_unaligned, sizeof(struct fh_sg_list)); /* Get the physical addresses of the source buffer */ - num_pinned = get_user_pages_unlocked(param.local_vaddr - lb_offset, - num_pages, pages, (param.source == -1) ? 0 : FOLL_WRITE); + num_pinned = get_user_pages_fast(param.local_vaddr - lb_offset, + num_pages, param.source != -1, pages); if (num_pinned != num_pages) { /* get_user_pages() failed */ From a6e0d12fc6fa6e48b51858f4ef1c0469f8036985 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Fri, 22 Sep 2017 18:16:11 -0400 Subject: [PATCH 4/8] via_dmablit(): use get_user_pages_fast() Signed-off-by: Al Viro --- drivers/gpu/drm/via/via_dmablit.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/via/via_dmablit.c b/drivers/gpu/drm/via/via_dmablit.c index 98aae9809249..32c9938e1e1e 100644 --- a/drivers/gpu/drm/via/via_dmablit.c +++ b/drivers/gpu/drm/via/via_dmablit.c @@ -238,9 +238,9 @@ via_lock_all_dma_pages(drm_via_sg_info_t *vsg, drm_via_dmablit_t *xfer) vsg->pages = vzalloc(sizeof(struct page *) * vsg->num_pages); if (NULL == vsg->pages) return -ENOMEM; - ret = get_user_pages_unlocked((unsigned long)xfer->mem_addr, - vsg->num_pages, vsg->pages, - (vsg->direction == DMA_FROM_DEVICE) ? FOLL_WRITE : 0); + ret = get_user_pages_fast((unsigned long)xfer->mem_addr, + vsg->num_pages, vsg->direction == DMA_FROM_DEVICE, + vsg->pages); if (ret != vsg->num_pages) { if (ret < 0) return ret; From 43bfe7bc3c2817f42548f650e82aa506d605c0a3 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Fri, 22 Sep 2017 18:18:55 -0400 Subject: [PATCH 5/8] st: use get_user_pages_fast() Signed-off-by: Al Viro --- drivers/scsi/st.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c index 94e402ed30f6..b141d7641a2e 100644 --- a/drivers/scsi/st.c +++ b/drivers/scsi/st.c @@ -4920,11 +4920,7 @@ static int sgl_map_user_pages(struct st_buffer *STbp, /* Try to fault in all of the necessary pages */ /* rw==READ means read from drive, write into memory area */ - res = get_user_pages_unlocked( - uaddr, - nr_pages, - pages, - rw == READ ? FOLL_WRITE : 0); /* don't force */ + res = get_user_pages_fast(uaddr, nr_pages, rw == READ, pages); /* Errors and no page mapped should return here */ if (res < nr_pages) From e1a58a5421c6a9f4ab74810d6ecbbdb6b1b2e2c7 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Fri, 22 Sep 2017 18:21:11 -0400 Subject: [PATCH 6/8] atomisp: use get_user_pages_fast() Signed-off-by: Al Viro --- drivers/staging/media/atomisp/pci/atomisp2/hmm/hmm_bo.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/drivers/staging/media/atomisp/pci/atomisp2/hmm/hmm_bo.c b/drivers/staging/media/atomisp/pci/atomisp2/hmm/hmm_bo.c index 11162f595fc7..2052f8d2f137 100644 --- a/drivers/staging/media/atomisp/pci/atomisp2/hmm/hmm_bo.c +++ b/drivers/staging/media/atomisp/pci/atomisp2/hmm/hmm_bo.c @@ -1029,10 +1029,8 @@ static int alloc_user_pages(struct hmm_buffer_object *bo, } else { /*Handle frame buffer allocated in user space*/ mutex_unlock(&bo->mutex); - down_read(¤t->mm->mmap_sem); - page_nr = get_user_pages((unsigned long)userptr, - (int)(bo->pgnr), 1, pages, NULL); - up_read(¤t->mm->mmap_sem); + page_nr = get_user_pages_fast((unsigned long)userptr, + (int)(bo->pgnr), 1, pages); mutex_lock(&bo->mutex); bo->mem_type = HMM_BO_MEM_TYPE_USER; } From 8dcf932d541487307fc7388ebfad5955f5fae098 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Fri, 22 Sep 2017 18:22:05 -0400 Subject: [PATCH 7/8] pvr2fs: use get_user_pages_fast() Signed-off-by: Al Viro --- drivers/video/fbdev/pvr2fb.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/drivers/video/fbdev/pvr2fb.c b/drivers/video/fbdev/pvr2fb.c index 867c5218968f..a582d3ae7ac1 100644 --- a/drivers/video/fbdev/pvr2fb.c +++ b/drivers/video/fbdev/pvr2fb.c @@ -686,9 +686,7 @@ static ssize_t pvr2fb_write(struct fb_info *info, const char *buf, if (!pages) return -ENOMEM; - ret = get_user_pages_unlocked((unsigned long)buf, nr_pages, pages, - FOLL_WRITE); - + ret = get_user_pages_fast((unsigned long)buf, nr_pages, true, pages); if (ret < nr_pages) { nr_pages = ret; ret = -EINVAL; From 77478715ba9242017976fd01de189e77fa072f51 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Fri, 22 Sep 2017 18:23:17 -0400 Subject: [PATCH 8/8] ceph: use get_user_pages_fast() Signed-off-by: Al Viro --- net/ceph/pagevec.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/net/ceph/pagevec.c b/net/ceph/pagevec.c index 1a7c9a79a53c..4098b17d0812 100644 --- a/net/ceph/pagevec.c +++ b/net/ceph/pagevec.c @@ -24,9 +24,9 @@ struct page **ceph_get_direct_page_vector(const void __user *data, return ERR_PTR(-ENOMEM); while (got < num_pages) { - rc = get_user_pages_unlocked( + rc = get_user_pages_fast( (unsigned long)data + ((unsigned long)got * PAGE_SIZE), - num_pages - got, pages + got, write_page ? FOLL_WRITE : 0); + num_pages - got, write_page, pages + got); if (rc < 0) break; BUG_ON(rc == 0);