diff options
Diffstat (limited to 'mm/process_vm_access.c')
-rw-r--r-- | mm/process_vm_access.c | 12 |
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 | ||