diff options
22 files changed, 49 insertions, 54 deletions
diff --git a/arch/cris/arch-v32/drivers/cryptocop.c b/arch/cris/arch-v32/drivers/cryptocop.c index b5698c876fcc..099e170a93ee 100644 --- a/arch/cris/arch-v32/drivers/cryptocop.c +++ b/arch/cris/arch-v32/drivers/cryptocop.c | |||
@@ -2722,7 +2722,6 @@ static int cryptocop_ioctl_process(struct inode *inode, struct file *filp, unsig | |||
2722 | err = get_user_pages((unsigned long int)(oper.indata + prev_ix), | 2722 | err = get_user_pages((unsigned long int)(oper.indata + prev_ix), |
2723 | noinpages, | 2723 | noinpages, |
2724 | 0, /* read access only for in data */ | 2724 | 0, /* read access only for in data */ |
2725 | 0, /* no force */ | ||
2726 | inpages, | 2725 | inpages, |
2727 | NULL); | 2726 | NULL); |
2728 | 2727 | ||
@@ -2736,8 +2735,7 @@ static int cryptocop_ioctl_process(struct inode *inode, struct file *filp, unsig | |||
2736 | if (oper.do_cipher){ | 2735 | if (oper.do_cipher){ |
2737 | err = get_user_pages((unsigned long int)oper.cipher_outdata, | 2736 | err = get_user_pages((unsigned long int)oper.cipher_outdata, |
2738 | nooutpages, | 2737 | nooutpages, |
2739 | 1, /* write access for out data */ | 2738 | FOLL_WRITE, /* write access for out data */ |
2740 | 0, /* no force */ | ||
2741 | outpages, | 2739 | outpages, |
2742 | NULL); | 2740 | NULL); |
2743 | up_read(¤t->mm->mmap_sem); | 2741 | up_read(¤t->mm->mmap_sem); |
diff --git a/arch/ia64/kernel/err_inject.c b/arch/ia64/kernel/err_inject.c index 09f845793d12..5ed0ea92c5bf 100644 --- a/arch/ia64/kernel/err_inject.c +++ b/arch/ia64/kernel/err_inject.c | |||
@@ -142,7 +142,7 @@ store_virtual_to_phys(struct device *dev, struct device_attribute *attr, | |||
142 | u64 virt_addr=simple_strtoull(buf, NULL, 16); | 142 | u64 virt_addr=simple_strtoull(buf, NULL, 16); |
143 | int ret; | 143 | int ret; |
144 | 144 | ||
145 | ret = get_user_pages(virt_addr, 1, VM_READ, 0, NULL, NULL); | 145 | ret = get_user_pages(virt_addr, 1, FOLL_WRITE, NULL, NULL); |
146 | if (ret<=0) { | 146 | if (ret<=0) { |
147 | #ifdef ERR_INJ_DEBUG | 147 | #ifdef ERR_INJ_DEBUG |
148 | printk("Virtual address %lx is not existing.\n",virt_addr); | 148 | printk("Virtual address %lx is not existing.\n",virt_addr); |
diff --git a/arch/x86/mm/mpx.c b/arch/x86/mm/mpx.c index 80476878eb4c..e4f800999b32 100644 --- a/arch/x86/mm/mpx.c +++ b/arch/x86/mm/mpx.c | |||
@@ -544,10 +544,9 @@ static int mpx_resolve_fault(long __user *addr, int write) | |||
544 | { | 544 | { |
545 | long gup_ret; | 545 | long gup_ret; |
546 | int nr_pages = 1; | 546 | int nr_pages = 1; |
547 | int force = 0; | ||
548 | 547 | ||
549 | gup_ret = get_user_pages((unsigned long)addr, nr_pages, write, | 548 | gup_ret = get_user_pages((unsigned long)addr, nr_pages, |
550 | force, NULL, NULL); | 549 | write ? FOLL_WRITE : 0, NULL, NULL); |
551 | /* | 550 | /* |
552 | * get_user_pages() returns number of pages gotten. | 551 | * get_user_pages() returns number of pages gotten. |
553 | * 0 means we failed to fault in and get anything, | 552 | * 0 means we failed to fault in and get anything, |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c index 887483b8b818..dcaf691f56b5 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | |||
@@ -555,10 +555,13 @@ struct amdgpu_ttm_tt { | |||
555 | int amdgpu_ttm_tt_get_user_pages(struct ttm_tt *ttm, struct page **pages) | 555 | int amdgpu_ttm_tt_get_user_pages(struct ttm_tt *ttm, struct page **pages) |
556 | { | 556 | { |
557 | struct amdgpu_ttm_tt *gtt = (void *)ttm; | 557 | struct amdgpu_ttm_tt *gtt = (void *)ttm; |
558 | int write = !(gtt->userflags & AMDGPU_GEM_USERPTR_READONLY); | 558 | unsigned int flags = 0; |
559 | unsigned pinned = 0; | 559 | unsigned pinned = 0; |
560 | int r; | 560 | int r; |
561 | 561 | ||
562 | if (!(gtt->userflags & AMDGPU_GEM_USERPTR_READONLY)) | ||
563 | flags |= FOLL_WRITE; | ||
564 | |||
562 | if (gtt->userflags & AMDGPU_GEM_USERPTR_ANONONLY) { | 565 | if (gtt->userflags & AMDGPU_GEM_USERPTR_ANONONLY) { |
563 | /* check that we only use anonymous memory | 566 | /* check that we only use anonymous memory |
564 | to prevent problems with writeback */ | 567 | to prevent problems with writeback */ |
@@ -581,7 +584,7 @@ int amdgpu_ttm_tt_get_user_pages(struct ttm_tt *ttm, struct page **pages) | |||
581 | list_add(&guptask.list, >t->guptasks); | 584 | list_add(&guptask.list, >t->guptasks); |
582 | spin_unlock(>t->guptasklock); | 585 | spin_unlock(>t->guptasklock); |
583 | 586 | ||
584 | r = get_user_pages(userptr, num_pages, write, 0, p, NULL); | 587 | r = get_user_pages(userptr, num_pages, flags, p, NULL); |
585 | 588 | ||
586 | spin_lock(>t->guptasklock); | 589 | spin_lock(>t->guptasklock); |
587 | list_del(&guptask.list); | 590 | list_del(&guptask.list); |
diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c index 455268214b89..3de5e6e21662 100644 --- a/drivers/gpu/drm/radeon/radeon_ttm.c +++ b/drivers/gpu/drm/radeon/radeon_ttm.c | |||
@@ -566,7 +566,8 @@ static int radeon_ttm_tt_pin_userptr(struct ttm_tt *ttm) | |||
566 | uint64_t userptr = gtt->userptr + pinned * PAGE_SIZE; | 566 | uint64_t userptr = gtt->userptr + pinned * PAGE_SIZE; |
567 | struct page **pages = ttm->pages + pinned; | 567 | struct page **pages = ttm->pages + pinned; |
568 | 568 | ||
569 | r = get_user_pages(userptr, num_pages, write, 0, pages, NULL); | 569 | r = get_user_pages(userptr, num_pages, write ? FOLL_WRITE : 0, |
570 | pages, NULL); | ||
570 | if (r < 0) | 571 | if (r < 0) |
571 | goto release_pages; | 572 | goto release_pages; |
572 | 573 | ||
diff --git a/drivers/gpu/drm/via/via_dmablit.c b/drivers/gpu/drm/via/via_dmablit.c index 7e2a12c4fed2..1a3ad769f8c8 100644 --- a/drivers/gpu/drm/via/via_dmablit.c +++ b/drivers/gpu/drm/via/via_dmablit.c | |||
@@ -241,8 +241,8 @@ via_lock_all_dma_pages(drm_via_sg_info_t *vsg, drm_via_dmablit_t *xfer) | |||
241 | down_read(¤t->mm->mmap_sem); | 241 | down_read(¤t->mm->mmap_sem); |
242 | ret = get_user_pages((unsigned long)xfer->mem_addr, | 242 | ret = get_user_pages((unsigned long)xfer->mem_addr, |
243 | vsg->num_pages, | 243 | vsg->num_pages, |
244 | (vsg->direction == DMA_FROM_DEVICE), | 244 | (vsg->direction == DMA_FROM_DEVICE) ? FOLL_WRITE : 0, |
245 | 0, vsg->pages, NULL); | 245 | vsg->pages, NULL); |
246 | 246 | ||
247 | up_read(¤t->mm->mmap_sem); | 247 | up_read(¤t->mm->mmap_sem); |
248 | if (ret != vsg->num_pages) { | 248 | if (ret != vsg->num_pages) { |
diff --git a/drivers/infiniband/core/umem.c b/drivers/infiniband/core/umem.c index c68746ce6624..224ad274ea0b 100644 --- a/drivers/infiniband/core/umem.c +++ b/drivers/infiniband/core/umem.c | |||
@@ -94,6 +94,7 @@ struct ib_umem *ib_umem_get(struct ib_ucontext *context, unsigned long addr, | |||
94 | unsigned long dma_attrs = 0; | 94 | unsigned long dma_attrs = 0; |
95 | struct scatterlist *sg, *sg_list_start; | 95 | struct scatterlist *sg, *sg_list_start; |
96 | int need_release = 0; | 96 | int need_release = 0; |
97 | unsigned int gup_flags = FOLL_WRITE; | ||
97 | 98 | ||
98 | if (dmasync) | 99 | if (dmasync) |
99 | dma_attrs |= DMA_ATTR_WRITE_BARRIER; | 100 | dma_attrs |= DMA_ATTR_WRITE_BARRIER; |
@@ -183,6 +184,9 @@ struct ib_umem *ib_umem_get(struct ib_ucontext *context, unsigned long addr, | |||
183 | if (ret) | 184 | if (ret) |
184 | goto out; | 185 | goto out; |
185 | 186 | ||
187 | if (!umem->writable) | ||
188 | gup_flags |= FOLL_FORCE; | ||
189 | |||
186 | need_release = 1; | 190 | need_release = 1; |
187 | sg_list_start = umem->sg_head.sgl; | 191 | sg_list_start = umem->sg_head.sgl; |
188 | 192 | ||
@@ -190,7 +194,7 @@ struct ib_umem *ib_umem_get(struct ib_ucontext *context, unsigned long addr, | |||
190 | ret = get_user_pages(cur_base, | 194 | ret = get_user_pages(cur_base, |
191 | min_t(unsigned long, npages, | 195 | min_t(unsigned long, npages, |
192 | PAGE_SIZE / sizeof (struct page *)), | 196 | PAGE_SIZE / sizeof (struct page *)), |
193 | 1, !umem->writable, page_list, vma_list); | 197 | gup_flags, page_list, vma_list); |
194 | 198 | ||
195 | if (ret < 0) | 199 | if (ret < 0) |
196 | goto out; | 200 | goto out; |
diff --git a/drivers/infiniband/hw/mthca/mthca_memfree.c b/drivers/infiniband/hw/mthca/mthca_memfree.c index 6c00d04b8b28..c6fe89d79248 100644 --- a/drivers/infiniband/hw/mthca/mthca_memfree.c +++ b/drivers/infiniband/hw/mthca/mthca_memfree.c | |||
@@ -472,7 +472,7 @@ int mthca_map_user_db(struct mthca_dev *dev, struct mthca_uar *uar, | |||
472 | goto out; | 472 | goto out; |
473 | } | 473 | } |
474 | 474 | ||
475 | ret = get_user_pages(uaddr & PAGE_MASK, 1, 1, 0, pages, NULL); | 475 | ret = get_user_pages(uaddr & PAGE_MASK, 1, FOLL_WRITE, pages, NULL); |
476 | if (ret < 0) | 476 | if (ret < 0) |
477 | goto out; | 477 | goto out; |
478 | 478 | ||
diff --git a/drivers/infiniband/hw/qib/qib_user_pages.c b/drivers/infiniband/hw/qib/qib_user_pages.c index 2d2b94fd3633..75f08624ac05 100644 --- a/drivers/infiniband/hw/qib/qib_user_pages.c +++ b/drivers/infiniband/hw/qib/qib_user_pages.c | |||
@@ -67,7 +67,8 @@ static int __qib_get_user_pages(unsigned long start_page, size_t num_pages, | |||
67 | 67 | ||
68 | for (got = 0; got < num_pages; got += ret) { | 68 | for (got = 0; got < num_pages; got += ret) { |
69 | ret = get_user_pages(start_page + got * PAGE_SIZE, | 69 | ret = get_user_pages(start_page + got * PAGE_SIZE, |
70 | num_pages - got, 1, 1, | 70 | num_pages - got, |
71 | FOLL_WRITE | FOLL_FORCE, | ||
71 | p + got, NULL); | 72 | p + got, NULL); |
72 | if (ret < 0) | 73 | if (ret < 0) |
73 | goto bail_release; | 74 | goto bail_release; |
diff --git a/drivers/infiniband/hw/usnic/usnic_uiom.c b/drivers/infiniband/hw/usnic/usnic_uiom.c index a0b6ebee4d8a..1ccee6ea5bc3 100644 --- a/drivers/infiniband/hw/usnic/usnic_uiom.c +++ b/drivers/infiniband/hw/usnic/usnic_uiom.c | |||
@@ -111,6 +111,7 @@ static int usnic_uiom_get_pages(unsigned long addr, size_t size, int writable, | |||
111 | int i; | 111 | int i; |
112 | int flags; | 112 | int flags; |
113 | dma_addr_t pa; | 113 | dma_addr_t pa; |
114 | unsigned int gup_flags; | ||
114 | 115 | ||
115 | if (!can_do_mlock()) | 116 | if (!can_do_mlock()) |
116 | return -EPERM; | 117 | return -EPERM; |
@@ -135,6 +136,8 @@ static int usnic_uiom_get_pages(unsigned long addr, size_t size, int writable, | |||
135 | 136 | ||
136 | flags = IOMMU_READ | IOMMU_CACHE; | 137 | flags = IOMMU_READ | IOMMU_CACHE; |
137 | flags |= (writable) ? IOMMU_WRITE : 0; | 138 | flags |= (writable) ? IOMMU_WRITE : 0; |
139 | gup_flags = FOLL_WRITE; | ||
140 | gup_flags |= (writable) ? 0 : FOLL_FORCE; | ||
138 | cur_base = addr & PAGE_MASK; | 141 | cur_base = addr & PAGE_MASK; |
139 | ret = 0; | 142 | ret = 0; |
140 | 143 | ||
@@ -142,7 +145,7 @@ static int usnic_uiom_get_pages(unsigned long addr, size_t size, int writable, | |||
142 | ret = get_user_pages(cur_base, | 145 | ret = get_user_pages(cur_base, |
143 | min_t(unsigned long, npages, | 146 | min_t(unsigned long, npages, |
144 | PAGE_SIZE / sizeof(struct page *)), | 147 | PAGE_SIZE / sizeof(struct page *)), |
145 | 1, !writable, page_list, NULL); | 148 | gup_flags, page_list, NULL); |
146 | 149 | ||
147 | if (ret < 0) | 150 | if (ret < 0) |
148 | goto out; | 151 | goto out; |
diff --git a/drivers/media/v4l2-core/videobuf-dma-sg.c b/drivers/media/v4l2-core/videobuf-dma-sg.c index f300f060b3f3..1db0af6c7f94 100644 --- a/drivers/media/v4l2-core/videobuf-dma-sg.c +++ b/drivers/media/v4l2-core/videobuf-dma-sg.c | |||
@@ -156,6 +156,7 @@ static int videobuf_dma_init_user_locked(struct videobuf_dmabuf *dma, | |||
156 | { | 156 | { |
157 | unsigned long first, last; | 157 | unsigned long first, last; |
158 | int err, rw = 0; | 158 | int err, rw = 0; |
159 | unsigned int flags = FOLL_FORCE; | ||
159 | 160 | ||
160 | dma->direction = direction; | 161 | dma->direction = direction; |
161 | switch (dma->direction) { | 162 | switch (dma->direction) { |
@@ -178,12 +179,14 @@ static int videobuf_dma_init_user_locked(struct videobuf_dmabuf *dma, | |||
178 | if (NULL == dma->pages) | 179 | if (NULL == dma->pages) |
179 | return -ENOMEM; | 180 | return -ENOMEM; |
180 | 181 | ||
182 | if (rw == READ) | ||
183 | flags |= FOLL_WRITE; | ||
184 | |||
181 | dprintk(1, "init user [0x%lx+0x%lx => %d pages]\n", | 185 | dprintk(1, "init user [0x%lx+0x%lx => %d pages]\n", |
182 | data, size, dma->nr_pages); | 186 | data, size, dma->nr_pages); |
183 | 187 | ||
184 | err = get_user_pages(data & PAGE_MASK, dma->nr_pages, | 188 | err = get_user_pages(data & PAGE_MASK, dma->nr_pages, |
185 | rw == READ, 1, /* force */ | 189 | flags, dma->pages, NULL); |
186 | dma->pages, NULL); | ||
187 | 190 | ||
188 | if (err != dma->nr_pages) { | 191 | if (err != dma->nr_pages) { |
189 | dma->nr_pages = (err >= 0) ? err : 0; | 192 | dma->nr_pages = (err >= 0) ? err : 0; |
diff --git a/drivers/misc/mic/scif/scif_rma.c b/drivers/misc/mic/scif/scif_rma.c index e0203b1a20fd..f806a4471eb9 100644 --- a/drivers/misc/mic/scif/scif_rma.c +++ b/drivers/misc/mic/scif/scif_rma.c | |||
@@ -1396,8 +1396,7 @@ retry: | |||
1396 | pinned_pages->nr_pages = get_user_pages( | 1396 | pinned_pages->nr_pages = get_user_pages( |
1397 | (u64)addr, | 1397 | (u64)addr, |
1398 | nr_pages, | 1398 | nr_pages, |
1399 | !!(prot & SCIF_PROT_WRITE), | 1399 | (prot & SCIF_PROT_WRITE) ? FOLL_WRITE : 0, |
1400 | 0, | ||
1401 | pinned_pages->pages, | 1400 | pinned_pages->pages, |
1402 | NULL); | 1401 | NULL); |
1403 | up_write(&mm->mmap_sem); | 1402 | up_write(&mm->mmap_sem); |
diff --git a/drivers/misc/sgi-gru/grufault.c b/drivers/misc/sgi-gru/grufault.c index a2d97b9b17e3..6fb773dbcd0c 100644 --- a/drivers/misc/sgi-gru/grufault.c +++ b/drivers/misc/sgi-gru/grufault.c | |||
@@ -198,7 +198,7 @@ static int non_atomic_pte_lookup(struct vm_area_struct *vma, | |||
198 | #else | 198 | #else |
199 | *pageshift = PAGE_SHIFT; | 199 | *pageshift = PAGE_SHIFT; |
200 | #endif | 200 | #endif |
201 | if (get_user_pages(vaddr, 1, write, 0, &page, NULL) <= 0) | 201 | if (get_user_pages(vaddr, 1, write ? FOLL_WRITE : 0, &page, NULL) <= 0) |
202 | return -EFAULT; | 202 | return -EFAULT; |
203 | *paddr = page_to_phys(page); | 203 | *paddr = page_to_phys(page); |
204 | put_page(page); | 204 | put_page(page); |
diff --git a/drivers/platform/goldfish/goldfish_pipe.c b/drivers/platform/goldfish/goldfish_pipe.c index 07462d79d040..1aba2c74160e 100644 --- a/drivers/platform/goldfish/goldfish_pipe.c +++ b/drivers/platform/goldfish/goldfish_pipe.c | |||
@@ -309,7 +309,8 @@ static ssize_t goldfish_pipe_read_write(struct file *filp, char __user *buffer, | |||
309 | * much memory to the process. | 309 | * much memory to the process. |
310 | */ | 310 | */ |
311 | down_read(¤t->mm->mmap_sem); | 311 | down_read(¤t->mm->mmap_sem); |
312 | ret = get_user_pages(address, 1, !is_write, 0, &page, NULL); | 312 | ret = get_user_pages(address, 1, is_write ? 0 : FOLL_WRITE, |
313 | &page, NULL); | ||
313 | up_read(¤t->mm->mmap_sem); | 314 | up_read(¤t->mm->mmap_sem); |
314 | if (ret < 0) | 315 | if (ret < 0) |
315 | break; | 316 | break; |
diff --git a/drivers/rapidio/devices/rio_mport_cdev.c b/drivers/rapidio/devices/rio_mport_cdev.c index 436dfe871d32..9013a585507e 100644 --- a/drivers/rapidio/devices/rio_mport_cdev.c +++ b/drivers/rapidio/devices/rio_mport_cdev.c | |||
@@ -892,7 +892,8 @@ rio_dma_transfer(struct file *filp, u32 transfer_mode, | |||
892 | down_read(¤t->mm->mmap_sem); | 892 | down_read(¤t->mm->mmap_sem); |
893 | pinned = get_user_pages( | 893 | pinned = get_user_pages( |
894 | (unsigned long)xfer->loc_addr & PAGE_MASK, | 894 | (unsigned long)xfer->loc_addr & PAGE_MASK, |
895 | nr_pages, dir == DMA_FROM_DEVICE, 0, | 895 | nr_pages, |
896 | dir == DMA_FROM_DEVICE ? FOLL_WRITE : 0, | ||
896 | page_list, NULL); | 897 | page_list, NULL); |
897 | up_read(¤t->mm->mmap_sem); | 898 | up_read(¤t->mm->mmap_sem); |
898 | 899 | ||
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 c29040fdf9a7..1091b9f1dd07 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 | |||
@@ -423,8 +423,7 @@ create_pagelist(char __user *buf, size_t count, unsigned short type, | |||
423 | actual_pages = get_user_pages(task, task->mm, | 423 | actual_pages = get_user_pages(task, task->mm, |
424 | (unsigned long)buf & ~(PAGE_SIZE - 1), | 424 | (unsigned long)buf & ~(PAGE_SIZE - 1), |
425 | num_pages, | 425 | num_pages, |
426 | (type == PAGELIST_READ) /*Write */ , | 426 | (type == PAGELIST_READ) ? FOLL_WRITE : 0, |
427 | 0 /*Force */ , | ||
428 | pages, | 427 | pages, |
429 | NULL /*vmas */); | 428 | NULL /*vmas */); |
430 | up_read(&task->mm->mmap_sem); | 429 | up_read(&task->mm->mmap_sem); |
diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c index e11c0e07471b..7b6cd4d80621 100644 --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c | |||
@@ -1477,8 +1477,7 @@ dump_phys_mem(void *virt_addr, uint32_t num_bytes) | |||
1477 | current->mm, /* mm */ | 1477 | current->mm, /* mm */ |
1478 | (unsigned long)virt_addr, /* start */ | 1478 | (unsigned long)virt_addr, /* start */ |
1479 | num_pages, /* len */ | 1479 | num_pages, /* len */ |
1480 | 0, /* write */ | 1480 | 0, /* gup_flags */ |
1481 | 0, /* force */ | ||
1482 | pages, /* pages (array of page pointers) */ | 1481 | pages, /* pages (array of page pointers) */ |
1483 | NULL); /* vmas */ | 1482 | NULL); /* vmas */ |
1484 | up_read(¤t->mm->mmap_sem); | 1483 | up_read(¤t->mm->mmap_sem); |
diff --git a/drivers/virt/fsl_hypervisor.c b/drivers/virt/fsl_hypervisor.c index 60bdad3a689b..150ce2abf6c8 100644 --- a/drivers/virt/fsl_hypervisor.c +++ b/drivers/virt/fsl_hypervisor.c | |||
@@ -245,8 +245,8 @@ static long ioctl_memcpy(struct fsl_hv_ioctl_memcpy __user *p) | |||
245 | /* Get the physical addresses of the source buffer */ | 245 | /* Get the physical addresses of the source buffer */ |
246 | down_read(¤t->mm->mmap_sem); | 246 | down_read(¤t->mm->mmap_sem); |
247 | num_pinned = get_user_pages(param.local_vaddr - lb_offset, | 247 | num_pinned = get_user_pages(param.local_vaddr - lb_offset, |
248 | num_pages, (param.source == -1) ? READ : WRITE, | 248 | num_pages, (param.source == -1) ? 0 : FOLL_WRITE, |
249 | 0, pages, NULL); | 249 | pages, NULL); |
250 | up_read(¤t->mm->mmap_sem); | 250 | up_read(¤t->mm->mmap_sem); |
251 | 251 | ||
252 | if (num_pinned != num_pages) { | 252 | if (num_pinned != num_pages) { |
diff --git a/include/linux/mm.h b/include/linux/mm.h index 91cc923ce985..30bb5d9631bb 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
@@ -1279,7 +1279,7 @@ long get_user_pages_remote(struct task_struct *tsk, struct mm_struct *mm, | |||
1279 | int write, int force, struct page **pages, | 1279 | int write, int force, struct page **pages, |
1280 | struct vm_area_struct **vmas); | 1280 | struct vm_area_struct **vmas); |
1281 | long get_user_pages(unsigned long start, unsigned long nr_pages, | 1281 | long get_user_pages(unsigned long start, unsigned long nr_pages, |
1282 | int write, int force, struct page **pages, | 1282 | unsigned int gup_flags, struct page **pages, |
1283 | struct vm_area_struct **vmas); | 1283 | struct vm_area_struct **vmas); |
1284 | long get_user_pages_locked(unsigned long start, unsigned long nr_pages, | 1284 | long get_user_pages_locked(unsigned long start, unsigned long nr_pages, |
1285 | unsigned int gup_flags, struct page **pages, int *locked); | 1285 | unsigned int gup_flags, struct page **pages, int *locked); |
@@ -987,18 +987,12 @@ EXPORT_SYMBOL(get_user_pages_remote); | |||
987 | * obviously don't pass FOLL_REMOTE in here. | 987 | * obviously don't pass FOLL_REMOTE in here. |
988 | */ | 988 | */ |
989 | long get_user_pages(unsigned long start, unsigned long nr_pages, | 989 | long get_user_pages(unsigned long start, unsigned long nr_pages, |
990 | int write, int force, struct page **pages, | 990 | unsigned int gup_flags, struct page **pages, |
991 | struct vm_area_struct **vmas) | 991 | struct vm_area_struct **vmas) |
992 | { | 992 | { |
993 | unsigned int flags = FOLL_TOUCH; | ||
994 | |||
995 | if (write) | ||
996 | flags |= FOLL_WRITE; | ||
997 | if (force) | ||
998 | flags |= FOLL_FORCE; | ||
999 | |||
1000 | return __get_user_pages_locked(current, current->mm, start, nr_pages, | 993 | return __get_user_pages_locked(current, current->mm, start, nr_pages, |
1001 | pages, vmas, NULL, false, flags); | 994 | pages, vmas, NULL, false, |
995 | gup_flags | FOLL_TOUCH); | ||
1002 | } | 996 | } |
1003 | EXPORT_SYMBOL(get_user_pages); | 997 | EXPORT_SYMBOL(get_user_pages); |
1004 | 998 | ||
diff --git a/mm/mempolicy.c b/mm/mempolicy.c index ad1c96ac313c..0b859af06b87 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c | |||
@@ -850,7 +850,7 @@ static int lookup_node(unsigned long addr) | |||
850 | struct page *p; | 850 | struct page *p; |
851 | int err; | 851 | int err; |
852 | 852 | ||
853 | err = get_user_pages(addr & PAGE_MASK, 1, 0, 0, &p, NULL); | 853 | err = get_user_pages(addr & PAGE_MASK, 1, 0, &p, NULL); |
854 | if (err >= 0) { | 854 | if (err >= 0) { |
855 | err = page_to_nid(p); | 855 | err = page_to_nid(p); |
856 | put_page(p); | 856 | put_page(p); |
diff --git a/mm/nommu.c b/mm/nommu.c index 842cfdd1a31e..70cb844dfd95 100644 --- a/mm/nommu.c +++ b/mm/nommu.c | |||
@@ -160,18 +160,11 @@ finish_or_fault: | |||
160 | * - don't permit access to VMAs that don't support it, such as I/O mappings | 160 | * - don't permit access to VMAs that don't support it, such as I/O mappings |
161 | */ | 161 | */ |
162 | long get_user_pages(unsigned long start, unsigned long nr_pages, | 162 | long get_user_pages(unsigned long start, unsigned long nr_pages, |
163 | int write, int force, struct page **pages, | 163 | unsigned int gup_flags, struct page **pages, |
164 | struct vm_area_struct **vmas) | 164 | struct vm_area_struct **vmas) |
165 | { | 165 | { |
166 | int flags = 0; | 166 | return __get_user_pages(current, current->mm, start, nr_pages, |
167 | 167 | gup_flags, pages, vmas, NULL); | |
168 | if (write) | ||
169 | flags |= FOLL_WRITE; | ||
170 | if (force) | ||
171 | flags |= FOLL_FORCE; | ||
172 | |||
173 | return __get_user_pages(current, current->mm, start, nr_pages, flags, | ||
174 | pages, vmas, NULL); | ||
175 | } | 168 | } |
176 | EXPORT_SYMBOL(get_user_pages); | 169 | EXPORT_SYMBOL(get_user_pages); |
177 | 170 | ||
@@ -179,10 +172,7 @@ long get_user_pages_locked(unsigned long start, unsigned long nr_pages, | |||
179 | unsigned int gup_flags, struct page **pages, | 172 | unsigned int gup_flags, struct page **pages, |
180 | int *locked) | 173 | int *locked) |
181 | { | 174 | { |
182 | int write = gup_flags & FOLL_WRITE; | 175 | return get_user_pages(start, nr_pages, gup_flags, pages, NULL); |
183 | int force = gup_flags & FOLL_FORCE; | ||
184 | |||
185 | return get_user_pages(start, nr_pages, write, force, pages, NULL); | ||
186 | } | 176 | } |
187 | EXPORT_SYMBOL(get_user_pages_locked); | 177 | EXPORT_SYMBOL(get_user_pages_locked); |
188 | 178 | ||