aboutsummaryrefslogtreecommitdiffstats
path: root/mm/process_vm_access.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/process_vm_access.c')
-rw-r--r--mm/process_vm_access.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/mm/process_vm_access.c b/mm/process_vm_access.c
index be8dc8d1edb9..84d0c7eada2b 100644
--- a/mm/process_vm_access.c
+++ b/mm/process_vm_access.c
@@ -88,7 +88,7 @@ static int process_vm_rw_single_vec(unsigned long addr,
88 ssize_t rc = 0; 88 ssize_t rc = 0;
89 unsigned long max_pages_per_loop = PVM_MAX_KMALLOC_PAGES 89 unsigned long max_pages_per_loop = PVM_MAX_KMALLOC_PAGES
90 / sizeof(struct pages *); 90 / sizeof(struct pages *);
91 unsigned int flags = FOLL_REMOTE; 91 unsigned int flags = 0;
92 92
93 /* Work out address and page range required */ 93 /* Work out address and page range required */
94 if (len == 0) 94 if (len == 0)
@@ -100,15 +100,19 @@ static int process_vm_rw_single_vec(unsigned long addr,
100 100
101 while (!rc && nr_pages && iov_iter_count(iter)) { 101 while (!rc && nr_pages && iov_iter_count(iter)) {
102 int pages = min(nr_pages, max_pages_per_loop); 102 int pages = min(nr_pages, max_pages_per_loop);
103 int locked = 1;
103 size_t bytes; 104 size_t bytes;
104 105
105 /* 106 /*
106 * Get the pages we're interested in. We must 107 * Get the pages we're interested in. We must
107 * add FOLL_REMOTE because task/mm might not 108 * access remotely because task/mm might not
108 * current/current->mm 109 * current/current->mm
109 */ 110 */
110 pages = __get_user_pages_unlocked(task, mm, pa, pages, 111 down_read(&mm->mmap_sem);
111 process_pages, flags); 112 pages = get_user_pages_remote(task, mm, pa, pages, flags,
113 process_pages, NULL, &locked);
114 if (locked)
115 up_read(&mm->mmap_sem);
112 if (pages <= 0) 116 if (pages <= 0)
113 return -EFAULT; 117 return -EFAULT;
114 118