diff options
author | Dave Hansen <dave.hansen@linux.intel.com> | 2016-02-12 16:01:56 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2016-02-16 04:11:12 -0500 |
commit | d4edcf0d56958db0aca0196314ca38a5e730ea92 (patch) | |
tree | cf22f82e4768f9db3b7b59491c5188e3d725ff9a | |
parent | cde70140fed8429acf7a14e2e2cbd3e329036653 (diff) |
mm/gup: Switch all callers of get_user_pages() to not pass tsk/mm
We will soon modify the vanilla get_user_pages() so it can no
longer be used on mm/tasks other than 'current/current->mm',
which is by far the most common way it is called. For now,
we allow the old-style calls, but warn when they are used.
(implemented in previous patch)
This patch switches all callers of:
get_user_pages()
get_user_pages_unlocked()
get_user_pages_locked()
to stop passing tsk/mm so they will no longer see the warnings.
Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Andrea Arcangeli <aarcange@redhat.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: Dave Hansen <dave@sr71.net>
Cc: Denys Vlasenko <dvlasenk@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Rik van Riel <riel@redhat.com>
Cc: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
Cc: Vlastimil Babka <vbabka@suse.cz>
Cc: jack@suse.cz
Cc: linux-mm@kvack.org
Link: http://lkml.kernel.org/r/20160212210156.113E9407@viggo.jf.intel.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
29 files changed, 44 insertions, 64 deletions
diff --git a/arch/cris/arch-v32/drivers/cryptocop.c b/arch/cris/arch-v32/drivers/cryptocop.c index 877da1908234..617645d21b20 100644 --- a/arch/cris/arch-v32/drivers/cryptocop.c +++ b/arch/cris/arch-v32/drivers/cryptocop.c | |||
@@ -2719,9 +2719,7 @@ static int cryptocop_ioctl_process(struct inode *inode, struct file *filp, unsig | |||
2719 | /* Acquire the mm page semaphore. */ | 2719 | /* Acquire the mm page semaphore. */ |
2720 | down_read(¤t->mm->mmap_sem); | 2720 | down_read(¤t->mm->mmap_sem); |
2721 | 2721 | ||
2722 | err = get_user_pages(current, | 2722 | err = get_user_pages((unsigned long int)(oper.indata + prev_ix), |
2723 | current->mm, | ||
2724 | (unsigned long int)(oper.indata + prev_ix), | ||
2725 | noinpages, | 2723 | noinpages, |
2726 | 0, /* read access only for in data */ | 2724 | 0, /* read access only for in data */ |
2727 | 0, /* no force */ | 2725 | 0, /* no force */ |
@@ -2736,9 +2734,7 @@ static int cryptocop_ioctl_process(struct inode *inode, struct file *filp, unsig | |||
2736 | } | 2734 | } |
2737 | noinpages = err; | 2735 | noinpages = err; |
2738 | if (oper.do_cipher){ | 2736 | if (oper.do_cipher){ |
2739 | err = get_user_pages(current, | 2737 | err = get_user_pages((unsigned long int)oper.cipher_outdata, |
2740 | current->mm, | ||
2741 | (unsigned long int)oper.cipher_outdata, | ||
2742 | nooutpages, | 2738 | nooutpages, |
2743 | 1, /* write access for out data */ | 2739 | 1, /* write access for out data */ |
2744 | 0, /* no force */ | 2740 | 0, /* no force */ |
diff --git a/arch/ia64/kernel/err_inject.c b/arch/ia64/kernel/err_inject.c index 0c161ed6d18e..09f845793d12 100644 --- a/arch/ia64/kernel/err_inject.c +++ b/arch/ia64/kernel/err_inject.c | |||
@@ -142,8 +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(current, current->mm, virt_addr, | 145 | ret = get_user_pages(virt_addr, 1, VM_READ, 0, NULL, NULL); |
146 | 1, VM_READ, 0, NULL, NULL); | ||
147 | if (ret<=0) { | 146 | if (ret<=0) { |
148 | #ifdef ERR_INJ_DEBUG | 147 | #ifdef ERR_INJ_DEBUG |
149 | 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/mips/mm/gup.c b/arch/mips/mm/gup.c index 1afd87c999b0..982e83f9d11f 100644 --- a/arch/mips/mm/gup.c +++ b/arch/mips/mm/gup.c | |||
@@ -286,8 +286,7 @@ slow_irqon: | |||
286 | start += nr << PAGE_SHIFT; | 286 | start += nr << PAGE_SHIFT; |
287 | pages += nr; | 287 | pages += nr; |
288 | 288 | ||
289 | ret = get_user_pages_unlocked(current, mm, start, | 289 | ret = get_user_pages_unlocked(start, (end - start) >> PAGE_SHIFT, |
290 | (end - start) >> PAGE_SHIFT, | ||
291 | write, 0, pages); | 290 | write, 0, pages); |
292 | 291 | ||
293 | /* Have to be a bit careful with return values */ | 292 | /* Have to be a bit careful with return values */ |
diff --git a/arch/s390/mm/gup.c b/arch/s390/mm/gup.c index 13dab0c1645c..49a1c84ed266 100644 --- a/arch/s390/mm/gup.c +++ b/arch/s390/mm/gup.c | |||
@@ -210,7 +210,6 @@ int __get_user_pages_fast(unsigned long start, int nr_pages, int write, | |||
210 | int get_user_pages_fast(unsigned long start, int nr_pages, int write, | 210 | int get_user_pages_fast(unsigned long start, int nr_pages, int write, |
211 | struct page **pages) | 211 | struct page **pages) |
212 | { | 212 | { |
213 | struct mm_struct *mm = current->mm; | ||
214 | int nr, ret; | 213 | int nr, ret; |
215 | 214 | ||
216 | might_sleep(); | 215 | might_sleep(); |
@@ -222,8 +221,7 @@ int get_user_pages_fast(unsigned long start, int nr_pages, int write, | |||
222 | /* Try to get the remaining pages with get_user_pages */ | 221 | /* Try to get the remaining pages with get_user_pages */ |
223 | start += nr << PAGE_SHIFT; | 222 | start += nr << PAGE_SHIFT; |
224 | pages += nr; | 223 | pages += nr; |
225 | ret = get_user_pages_unlocked(current, mm, start, | 224 | ret = get_user_pages_unlocked(start, nr_pages - nr, write, 0, pages); |
226 | nr_pages - nr, write, 0, pages); | ||
227 | /* Have to be a bit careful with return values */ | 225 | /* Have to be a bit careful with return values */ |
228 | if (nr > 0) | 226 | if (nr > 0) |
229 | ret = (ret < 0) ? nr : ret + nr; | 227 | ret = (ret < 0) ? nr : ret + nr; |
diff --git a/arch/sh/mm/gup.c b/arch/sh/mm/gup.c index e7af6a65baab..40fa6c8adc43 100644 --- a/arch/sh/mm/gup.c +++ b/arch/sh/mm/gup.c | |||
@@ -257,7 +257,7 @@ slow_irqon: | |||
257 | start += nr << PAGE_SHIFT; | 257 | start += nr << PAGE_SHIFT; |
258 | pages += nr; | 258 | pages += nr; |
259 | 259 | ||
260 | ret = get_user_pages_unlocked(current, mm, start, | 260 | ret = get_user_pages_unlocked(start, |
261 | (end - start) >> PAGE_SHIFT, write, 0, pages); | 261 | (end - start) >> PAGE_SHIFT, write, 0, pages); |
262 | 262 | ||
263 | /* Have to be a bit careful with return values */ | 263 | /* Have to be a bit careful with return values */ |
diff --git a/arch/sparc/mm/gup.c b/arch/sparc/mm/gup.c index eb3d8e8ebc6b..4e06750a5d29 100644 --- a/arch/sparc/mm/gup.c +++ b/arch/sparc/mm/gup.c | |||
@@ -237,7 +237,7 @@ slow: | |||
237 | start += nr << PAGE_SHIFT; | 237 | start += nr << PAGE_SHIFT; |
238 | pages += nr; | 238 | pages += nr; |
239 | 239 | ||
240 | ret = get_user_pages_unlocked(current, mm, start, | 240 | ret = get_user_pages_unlocked(start, |
241 | (end - start) >> PAGE_SHIFT, write, 0, pages); | 241 | (end - start) >> PAGE_SHIFT, write, 0, pages); |
242 | 242 | ||
243 | /* Have to be a bit careful with return values */ | 243 | /* Have to be a bit careful with return values */ |
diff --git a/arch/x86/mm/gup.c b/arch/x86/mm/gup.c index 6d5eb5900372..ce5e4545203b 100644 --- a/arch/x86/mm/gup.c +++ b/arch/x86/mm/gup.c | |||
@@ -422,7 +422,7 @@ slow_irqon: | |||
422 | start += nr << PAGE_SHIFT; | 422 | start += nr << PAGE_SHIFT; |
423 | pages += nr; | 423 | pages += nr; |
424 | 424 | ||
425 | ret = get_user_pages_unlocked(current, mm, start, | 425 | ret = get_user_pages_unlocked(start, |
426 | (end - start) >> PAGE_SHIFT, | 426 | (end - start) >> PAGE_SHIFT, |
427 | write, 0, pages); | 427 | write, 0, pages); |
428 | 428 | ||
diff --git a/arch/x86/mm/mpx.c b/arch/x86/mm/mpx.c index b2fd67da1701..84fa4a482c78 100644 --- a/arch/x86/mm/mpx.c +++ b/arch/x86/mm/mpx.c | |||
@@ -546,8 +546,8 @@ static int mpx_resolve_fault(long __user *addr, int write) | |||
546 | int nr_pages = 1; | 546 | int nr_pages = 1; |
547 | int force = 0; | 547 | int force = 0; |
548 | 548 | ||
549 | gup_ret = get_user_pages(current, current->mm, (unsigned long)addr, | 549 | gup_ret = get_user_pages((unsigned long)addr, nr_pages, write, |
550 | nr_pages, write, force, NULL, NULL); | 550 | force, NULL, NULL); |
551 | /* | 551 | /* |
552 | * get_user_pages() returns number of pages gotten. | 552 | * get_user_pages() returns number of pages gotten. |
553 | * 0 means we failed to fault in and get anything, | 553 | * 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 6442a06d6fdc..5fedfb68d7ca 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | |||
@@ -518,8 +518,7 @@ static int amdgpu_ttm_tt_pin_userptr(struct ttm_tt *ttm) | |||
518 | uint64_t userptr = gtt->userptr + pinned * PAGE_SIZE; | 518 | uint64_t userptr = gtt->userptr + pinned * PAGE_SIZE; |
519 | struct page **pages = ttm->pages + pinned; | 519 | struct page **pages = ttm->pages + pinned; |
520 | 520 | ||
521 | r = get_user_pages(current, current->mm, userptr, num_pages, | 521 | r = get_user_pages(userptr, num_pages, write, 0, pages, NULL); |
522 | write, 0, pages, NULL); | ||
523 | if (r < 0) | 522 | if (r < 0) |
524 | goto release_pages; | 523 | goto release_pages; |
525 | 524 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c index e34307459e50..927a9f2d6570 100644 --- a/drivers/gpu/drm/radeon/radeon_ttm.c +++ b/drivers/gpu/drm/radeon/radeon_ttm.c | |||
@@ -554,8 +554,7 @@ static int radeon_ttm_tt_pin_userptr(struct ttm_tt *ttm) | |||
554 | uint64_t userptr = gtt->userptr + pinned * PAGE_SIZE; | 554 | uint64_t userptr = gtt->userptr + pinned * PAGE_SIZE; |
555 | struct page **pages = ttm->pages + pinned; | 555 | struct page **pages = ttm->pages + pinned; |
556 | 556 | ||
557 | r = get_user_pages(current, current->mm, userptr, num_pages, | 557 | r = get_user_pages(userptr, num_pages, write, 0, pages, NULL); |
558 | write, 0, pages, NULL); | ||
559 | if (r < 0) | 558 | if (r < 0) |
560 | goto release_pages; | 559 | goto release_pages; |
561 | 560 | ||
diff --git a/drivers/gpu/drm/via/via_dmablit.c b/drivers/gpu/drm/via/via_dmablit.c index d0cbd5ecd7f0..e797dfc07ae3 100644 --- a/drivers/gpu/drm/via/via_dmablit.c +++ b/drivers/gpu/drm/via/via_dmablit.c | |||
@@ -239,8 +239,7 @@ via_lock_all_dma_pages(drm_via_sg_info_t *vsg, drm_via_dmablit_t *xfer) | |||
239 | if (NULL == vsg->pages) | 239 | if (NULL == vsg->pages) |
240 | return -ENOMEM; | 240 | return -ENOMEM; |
241 | down_read(¤t->mm->mmap_sem); | 241 | down_read(¤t->mm->mmap_sem); |
242 | ret = get_user_pages(current, current->mm, | 242 | ret = get_user_pages((unsigned long)xfer->mem_addr, |
243 | (unsigned long)xfer->mem_addr, | ||
244 | vsg->num_pages, | 243 | vsg->num_pages, |
245 | (vsg->direction == DMA_FROM_DEVICE), | 244 | (vsg->direction == DMA_FROM_DEVICE), |
246 | 0, vsg->pages, NULL); | 245 | 0, vsg->pages, NULL); |
diff --git a/drivers/infiniband/core/umem.c b/drivers/infiniband/core/umem.c index 38acb3cfc545..fe4d2e1a8b58 100644 --- a/drivers/infiniband/core/umem.c +++ b/drivers/infiniband/core/umem.c | |||
@@ -188,7 +188,7 @@ struct ib_umem *ib_umem_get(struct ib_ucontext *context, unsigned long addr, | |||
188 | sg_list_start = umem->sg_head.sgl; | 188 | sg_list_start = umem->sg_head.sgl; |
189 | 189 | ||
190 | while (npages) { | 190 | while (npages) { |
191 | ret = get_user_pages(current, current->mm, cur_base, | 191 | ret = get_user_pages(cur_base, |
192 | min_t(unsigned long, npages, | 192 | min_t(unsigned long, npages, |
193 | PAGE_SIZE / sizeof (struct page *)), | 193 | PAGE_SIZE / sizeof (struct page *)), |
194 | 1, !umem->writable, page_list, vma_list); | 194 | 1, !umem->writable, page_list, vma_list); |
diff --git a/drivers/infiniband/hw/mthca/mthca_memfree.c b/drivers/infiniband/hw/mthca/mthca_memfree.c index 7d2e42dd6926..6c00d04b8b28 100644 --- a/drivers/infiniband/hw/mthca/mthca_memfree.c +++ b/drivers/infiniband/hw/mthca/mthca_memfree.c | |||
@@ -472,8 +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(current, current->mm, uaddr & PAGE_MASK, 1, 1, 0, | 475 | ret = get_user_pages(uaddr & PAGE_MASK, 1, 1, 0, pages, NULL); |
476 | pages, NULL); | ||
477 | if (ret < 0) | 476 | if (ret < 0) |
478 | goto out; | 477 | goto out; |
479 | 478 | ||
diff --git a/drivers/infiniband/hw/qib/qib_user_pages.c b/drivers/infiniband/hw/qib/qib_user_pages.c index 74f90b2619f6..2d2b94fd3633 100644 --- a/drivers/infiniband/hw/qib/qib_user_pages.c +++ b/drivers/infiniband/hw/qib/qib_user_pages.c | |||
@@ -66,8 +66,7 @@ static int __qib_get_user_pages(unsigned long start_page, size_t num_pages, | |||
66 | } | 66 | } |
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(current, current->mm, | 69 | ret = get_user_pages(start_page + got * PAGE_SIZE, |
70 | start_page + got * PAGE_SIZE, | ||
71 | num_pages - got, 1, 1, | 70 | num_pages - got, 1, 1, |
72 | p + got, NULL); | 71 | p + got, NULL); |
73 | if (ret < 0) | 72 | if (ret < 0) |
diff --git a/drivers/infiniband/hw/usnic/usnic_uiom.c b/drivers/infiniband/hw/usnic/usnic_uiom.c index 645a5f6e6c88..7209fbc03ccb 100644 --- a/drivers/infiniband/hw/usnic/usnic_uiom.c +++ b/drivers/infiniband/hw/usnic/usnic_uiom.c | |||
@@ -144,7 +144,7 @@ static int usnic_uiom_get_pages(unsigned long addr, size_t size, int writable, | |||
144 | ret = 0; | 144 | ret = 0; |
145 | 145 | ||
146 | while (npages) { | 146 | while (npages) { |
147 | ret = get_user_pages(current, current->mm, cur_base, | 147 | ret = get_user_pages(cur_base, |
148 | min_t(unsigned long, npages, | 148 | min_t(unsigned long, npages, |
149 | PAGE_SIZE / sizeof(struct page *)), | 149 | PAGE_SIZE / sizeof(struct page *)), |
150 | 1, !writable, page_list, NULL); | 150 | 1, !writable, page_list, NULL); |
diff --git a/drivers/media/pci/ivtv/ivtv-udma.c b/drivers/media/pci/ivtv/ivtv-udma.c index 24152accc66c..4769469fe842 100644 --- a/drivers/media/pci/ivtv/ivtv-udma.c +++ b/drivers/media/pci/ivtv/ivtv-udma.c | |||
@@ -124,8 +124,8 @@ int ivtv_udma_setup(struct ivtv *itv, unsigned long ivtv_dest_addr, | |||
124 | } | 124 | } |
125 | 125 | ||
126 | /* Get user pages for DMA Xfer */ | 126 | /* Get user pages for DMA Xfer */ |
127 | err = get_user_pages_unlocked(current, current->mm, | 127 | err = get_user_pages_unlocked(user_dma.uaddr, user_dma.page_count, 0, |
128 | user_dma.uaddr, user_dma.page_count, 0, 1, dma->map); | 128 | 1, dma->map); |
129 | 129 | ||
130 | if (user_dma.page_count != err) { | 130 | if (user_dma.page_count != err) { |
131 | IVTV_DEBUG_WARN("failed to map user pages, returned %d instead of %d\n", | 131 | IVTV_DEBUG_WARN("failed to map user pages, returned %d instead of %d\n", |
diff --git a/drivers/media/pci/ivtv/ivtv-yuv.c b/drivers/media/pci/ivtv/ivtv-yuv.c index 2b8e7b2f2b86..b094054cda6e 100644 --- a/drivers/media/pci/ivtv/ivtv-yuv.c +++ b/drivers/media/pci/ivtv/ivtv-yuv.c | |||
@@ -75,14 +75,12 @@ static int ivtv_yuv_prep_user_dma(struct ivtv *itv, struct ivtv_user_dma *dma, | |||
75 | ivtv_udma_get_page_info (&uv_dma, (unsigned long)args->uv_source, 360 * uv_decode_height); | 75 | ivtv_udma_get_page_info (&uv_dma, (unsigned long)args->uv_source, 360 * uv_decode_height); |
76 | 76 | ||
77 | /* Get user pages for DMA Xfer */ | 77 | /* Get user pages for DMA Xfer */ |
78 | y_pages = get_user_pages_unlocked(current, current->mm, | 78 | y_pages = get_user_pages_unlocked(y_dma.uaddr, |
79 | y_dma.uaddr, y_dma.page_count, 0, 1, | 79 | y_dma.page_count, 0, 1, &dma->map[0]); |
80 | &dma->map[0]); | ||
81 | uv_pages = 0; /* silence gcc. value is set and consumed only if: */ | 80 | uv_pages = 0; /* silence gcc. value is set and consumed only if: */ |
82 | if (y_pages == y_dma.page_count) { | 81 | if (y_pages == y_dma.page_count) { |
83 | uv_pages = get_user_pages_unlocked(current, current->mm, | 82 | uv_pages = get_user_pages_unlocked(uv_dma.uaddr, |
84 | uv_dma.uaddr, uv_dma.page_count, 0, 1, | 83 | uv_dma.page_count, 0, 1, &dma->map[y_pages]); |
85 | &dma->map[y_pages]); | ||
86 | } | 84 | } |
87 | 85 | ||
88 | if (y_pages != y_dma.page_count || uv_pages != uv_dma.page_count) { | 86 | if (y_pages != y_dma.page_count || uv_pages != uv_dma.page_count) { |
diff --git a/drivers/media/v4l2-core/videobuf-dma-sg.c b/drivers/media/v4l2-core/videobuf-dma-sg.c index f669cedca8bd..df4c052c6bd6 100644 --- a/drivers/media/v4l2-core/videobuf-dma-sg.c +++ b/drivers/media/v4l2-core/videobuf-dma-sg.c | |||
@@ -181,8 +181,7 @@ static int videobuf_dma_init_user_locked(struct videobuf_dmabuf *dma, | |||
181 | dprintk(1, "init user [0x%lx+0x%lx => %d pages]\n", | 181 | dprintk(1, "init user [0x%lx+0x%lx => %d pages]\n", |
182 | data, size, dma->nr_pages); | 182 | data, size, dma->nr_pages); |
183 | 183 | ||
184 | err = get_user_pages(current, current->mm, | 184 | err = get_user_pages(data & PAGE_MASK, dma->nr_pages, |
185 | data & PAGE_MASK, dma->nr_pages, | ||
186 | rw == READ, 1, /* force */ | 185 | rw == READ, 1, /* force */ |
187 | dma->pages, NULL); | 186 | dma->pages, NULL); |
188 | 187 | ||
diff --git a/drivers/misc/mic/scif/scif_rma.c b/drivers/misc/mic/scif/scif_rma.c index 8310b4dbff06..0fa0d242b295 100644 --- a/drivers/misc/mic/scif/scif_rma.c +++ b/drivers/misc/mic/scif/scif_rma.c | |||
@@ -1394,8 +1394,6 @@ retry: | |||
1394 | } | 1394 | } |
1395 | 1395 | ||
1396 | pinned_pages->nr_pages = get_user_pages( | 1396 | pinned_pages->nr_pages = get_user_pages( |
1397 | current, | ||
1398 | mm, | ||
1399 | (u64)addr, | 1397 | (u64)addr, |
1400 | nr_pages, | 1398 | nr_pages, |
1401 | !!(prot & SCIF_PROT_WRITE), | 1399 | !!(prot & SCIF_PROT_WRITE), |
diff --git a/drivers/misc/sgi-gru/grufault.c b/drivers/misc/sgi-gru/grufault.c index f74fc0ca2ef9..a2d97b9b17e3 100644 --- a/drivers/misc/sgi-gru/grufault.c +++ b/drivers/misc/sgi-gru/grufault.c | |||
@@ -198,8 +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 | 201 | if (get_user_pages(vaddr, 1, write, 0, &page, NULL) <= 0) |
202 | (current, current->mm, vaddr, 1, write, 0, &page, NULL) <= 0) | ||
203 | return -EFAULT; | 202 | return -EFAULT; |
204 | *paddr = page_to_phys(page); | 203 | *paddr = page_to_phys(page); |
205 | put_page(page); | 204 | put_page(page); |
diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c index 2e522951b619..664852af4417 100644 --- a/drivers/scsi/st.c +++ b/drivers/scsi/st.c | |||
@@ -4817,8 +4817,6 @@ static int sgl_map_user_pages(struct st_buffer *STbp, | |||
4817 | /* Try to fault in all of the necessary pages */ | 4817 | /* Try to fault in all of the necessary pages */ |
4818 | /* rw==READ means read from drive, write into memory area */ | 4818 | /* rw==READ means read from drive, write into memory area */ |
4819 | res = get_user_pages_unlocked( | 4819 | res = get_user_pages_unlocked( |
4820 | current, | ||
4821 | current->mm, | ||
4822 | uaddr, | 4820 | uaddr, |
4823 | nr_pages, | 4821 | nr_pages, |
4824 | rw == READ, | 4822 | rw == READ, |
diff --git a/drivers/video/fbdev/pvr2fb.c b/drivers/video/fbdev/pvr2fb.c index 0e24eb9c219c..71a923e53f93 100644 --- a/drivers/video/fbdev/pvr2fb.c +++ b/drivers/video/fbdev/pvr2fb.c | |||
@@ -686,8 +686,8 @@ static ssize_t pvr2fb_write(struct fb_info *info, const char *buf, | |||
686 | if (!pages) | 686 | if (!pages) |
687 | return -ENOMEM; | 687 | return -ENOMEM; |
688 | 688 | ||
689 | ret = get_user_pages_unlocked(current, current->mm, (unsigned long)buf, | 689 | ret = get_user_pages_unlocked((unsigned long)buf, nr_pages, WRITE, |
690 | nr_pages, WRITE, 0, pages); | 690 | 0, pages); |
691 | 691 | ||
692 | if (ret < nr_pages) { | 692 | if (ret < nr_pages) { |
693 | nr_pages = ret; | 693 | nr_pages = ret; |
diff --git a/drivers/virt/fsl_hypervisor.c b/drivers/virt/fsl_hypervisor.c index 32c8fc5f7a5c..60bdad3a689b 100644 --- a/drivers/virt/fsl_hypervisor.c +++ b/drivers/virt/fsl_hypervisor.c | |||
@@ -244,9 +244,8 @@ static long ioctl_memcpy(struct fsl_hv_ioctl_memcpy __user *p) | |||
244 | 244 | ||
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(current, current->mm, | 247 | num_pinned = get_user_pages(param.local_vaddr - lb_offset, |
248 | param.local_vaddr - lb_offset, num_pages, | 248 | num_pages, (param.source == -1) ? READ : WRITE, |
249 | (param.source == -1) ? READ : WRITE, | ||
250 | 0, pages, NULL); | 249 | 0, pages, NULL); |
251 | up_read(¤t->mm->mmap_sem); | 250 | up_read(¤t->mm->mmap_sem); |
252 | 251 | ||
diff --git a/mm/frame_vector.c b/mm/frame_vector.c index 7cf2b7163222..381bb07ed14f 100644 --- a/mm/frame_vector.c +++ b/mm/frame_vector.c | |||
@@ -58,7 +58,7 @@ int get_vaddr_frames(unsigned long start, unsigned int nr_frames, | |||
58 | if (!(vma->vm_flags & (VM_IO | VM_PFNMAP))) { | 58 | if (!(vma->vm_flags & (VM_IO | VM_PFNMAP))) { |
59 | vec->got_ref = true; | 59 | vec->got_ref = true; |
60 | vec->is_pfns = false; | 60 | vec->is_pfns = false; |
61 | ret = get_user_pages_locked(current, mm, start, nr_frames, | 61 | ret = get_user_pages_locked(start, nr_frames, |
62 | write, force, (struct page **)(vec->ptrs), &locked); | 62 | write, force, (struct page **)(vec->ptrs), &locked); |
63 | goto out; | 63 | goto out; |
64 | } | 64 | } |
@@ -936,8 +936,10 @@ long get_user_pages_remote(struct task_struct *tsk, struct mm_struct *mm, | |||
936 | EXPORT_SYMBOL(get_user_pages_remote); | 936 | EXPORT_SYMBOL(get_user_pages_remote); |
937 | 937 | ||
938 | /* | 938 | /* |
939 | * This is the same as get_user_pages_remote() for the time | 939 | * This is the same as get_user_pages_remote(), just with a |
940 | * being. | 940 | * less-flexible calling convention where we assume that the task |
941 | * and mm being operated on are the current task's. We also | ||
942 | * obviously don't pass FOLL_REMOTE in here. | ||
941 | */ | 943 | */ |
942 | long get_user_pages6(unsigned long start, unsigned long nr_pages, | 944 | long get_user_pages6(unsigned long start, unsigned long nr_pages, |
943 | int write, int force, struct page **pages, | 945 | int write, int force, struct page **pages, |
@@ -352,7 +352,7 @@ static inline bool ksm_test_exit(struct mm_struct *mm) | |||
352 | /* | 352 | /* |
353 | * We use break_ksm to break COW on a ksm page: it's a stripped down | 353 | * We use break_ksm to break COW on a ksm page: it's a stripped down |
354 | * | 354 | * |
355 | * if (get_user_pages(current, mm, addr, 1, 1, 1, &page, NULL) == 1) | 355 | * if (get_user_pages(addr, 1, 1, 1, &page, NULL) == 1) |
356 | * put_page(page); | 356 | * put_page(page); |
357 | * | 357 | * |
358 | * but taking great care only to touch a ksm page, in a VM_MERGEABLE vma, | 358 | * but taking great care only to touch a ksm page, in a VM_MERGEABLE vma, |
diff --git a/mm/mempolicy.c b/mm/mempolicy.c index 4c4187c0e1de..dd0ce7fbd47b 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c | |||
@@ -844,12 +844,12 @@ static void get_policy_nodemask(struct mempolicy *p, nodemask_t *nodes) | |||
844 | } | 844 | } |
845 | } | 845 | } |
846 | 846 | ||
847 | static int lookup_node(struct mm_struct *mm, unsigned long addr) | 847 | static int lookup_node(unsigned long addr) |
848 | { | 848 | { |
849 | struct page *p; | 849 | struct page *p; |
850 | int err; | 850 | int err; |
851 | 851 | ||
852 | err = get_user_pages(current, mm, addr & PAGE_MASK, 1, 0, 0, &p, NULL); | 852 | err = get_user_pages(addr & PAGE_MASK, 1, 0, 0, &p, NULL); |
853 | if (err >= 0) { | 853 | if (err >= 0) { |
854 | err = page_to_nid(p); | 854 | err = page_to_nid(p); |
855 | put_page(p); | 855 | put_page(p); |
@@ -904,7 +904,7 @@ static long do_get_mempolicy(int *policy, nodemask_t *nmask, | |||
904 | 904 | ||
905 | if (flags & MPOL_F_NODE) { | 905 | if (flags & MPOL_F_NODE) { |
906 | if (flags & MPOL_F_ADDR) { | 906 | if (flags & MPOL_F_ADDR) { |
907 | err = lookup_node(mm, addr); | 907 | err = lookup_node(addr); |
908 | if (err < 0) | 908 | if (err < 0) |
909 | goto out; | 909 | goto out; |
910 | *policy = err; | 910 | *policy = err; |
diff --git a/net/ceph/pagevec.c b/net/ceph/pagevec.c index d4f5f220a8e5..10297f7a89ba 100644 --- a/net/ceph/pagevec.c +++ b/net/ceph/pagevec.c | |||
@@ -24,7 +24,7 @@ struct page **ceph_get_direct_page_vector(const void __user *data, | |||
24 | return ERR_PTR(-ENOMEM); | 24 | return ERR_PTR(-ENOMEM); |
25 | 25 | ||
26 | while (got < num_pages) { | 26 | while (got < num_pages) { |
27 | rc = get_user_pages_unlocked(current, current->mm, | 27 | rc = get_user_pages_unlocked( |
28 | (unsigned long)data + ((unsigned long)got * PAGE_SIZE), | 28 | (unsigned long)data + ((unsigned long)got * PAGE_SIZE), |
29 | num_pages - got, write_page, 0, pages + got); | 29 | num_pages - got, write_page, 0, pages + got); |
30 | if (rc < 0) | 30 | if (rc < 0) |
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index a11cfd20a6a0..0253ad900ec3 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c | |||
@@ -1264,15 +1264,16 @@ unsigned long kvm_vcpu_gfn_to_hva_prot(struct kvm_vcpu *vcpu, gfn_t gfn, bool *w | |||
1264 | return gfn_to_hva_memslot_prot(slot, gfn, writable); | 1264 | return gfn_to_hva_memslot_prot(slot, gfn, writable); |
1265 | } | 1265 | } |
1266 | 1266 | ||
1267 | static int get_user_page_nowait(struct task_struct *tsk, struct mm_struct *mm, | 1267 | static int get_user_page_nowait(unsigned long start, int write, |
1268 | unsigned long start, int write, struct page **page) | 1268 | struct page **page) |
1269 | { | 1269 | { |
1270 | int flags = FOLL_TOUCH | FOLL_NOWAIT | FOLL_HWPOISON | FOLL_GET; | 1270 | int flags = FOLL_TOUCH | FOLL_NOWAIT | FOLL_HWPOISON | FOLL_GET; |
1271 | 1271 | ||
1272 | if (write) | 1272 | if (write) |
1273 | flags |= FOLL_WRITE; | 1273 | flags |= FOLL_WRITE; |
1274 | 1274 | ||
1275 | return __get_user_pages(tsk, mm, start, 1, flags, page, NULL, NULL); | 1275 | return __get_user_pages(current, current->mm, start, 1, flags, page, |
1276 | NULL, NULL); | ||
1276 | } | 1277 | } |
1277 | 1278 | ||
1278 | static inline int check_user_page_hwpoison(unsigned long addr) | 1279 | static inline int check_user_page_hwpoison(unsigned long addr) |
@@ -1334,8 +1335,7 @@ static int hva_to_pfn_slow(unsigned long addr, bool *async, bool write_fault, | |||
1334 | 1335 | ||
1335 | if (async) { | 1336 | if (async) { |
1336 | down_read(¤t->mm->mmap_sem); | 1337 | down_read(¤t->mm->mmap_sem); |
1337 | npages = get_user_page_nowait(current, current->mm, | 1338 | npages = get_user_page_nowait(addr, write_fault, page); |
1338 | addr, write_fault, page); | ||
1339 | up_read(¤t->mm->mmap_sem); | 1339 | up_read(¤t->mm->mmap_sem); |
1340 | } else | 1340 | } else |
1341 | npages = __get_user_pages_unlocked(current, current->mm, addr, 1, | 1341 | npages = __get_user_pages_unlocked(current, current->mm, addr, 1, |