Commit a1ea9549a7254b17ba85809f4a0200abc21453a2

Authored by Michel Lespinasse
Committed by Linus Torvalds
1 parent bebeb3d68b

mm: use mm_populate() for blocking remap_file_pages()

Signed-off-by: Michel Lespinasse <walken@google.com>
Reviewed-by: Rik van Riel <riel@redhat.com>
Tested-by: Andy Lutomirski <luto@amacapital.net>
Cc: Greg Ungerer <gregungerer@westnet.com.au>
Cc: David Howells <dhowells@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

Showing 1 changed file with 6 additions and 16 deletions Side-by-side Diff

... ... @@ -129,6 +129,7 @@
129 129 struct vm_area_struct *vma;
130 130 int err = -EINVAL;
131 131 int has_write_lock = 0;
  132 + vm_flags_t vm_flags;
132 133  
133 134 if (prot)
134 135 return err;
135 136  
136 137  
137 138  
... ... @@ -228,30 +229,16 @@
228 229 /*
229 230 * drop PG_Mlocked flag for over-mapped range
230 231 */
231   - vm_flags_t saved_flags = vma->vm_flags;
232 232 if (!has_write_lock)
233 233 goto get_write_lock;
  234 + vm_flags = vma->vm_flags;
234 235 munlock_vma_pages_range(vma, start, start + size);
235   - vma->vm_flags = saved_flags;
  236 + vma->vm_flags = vm_flags;
236 237 }
237 238  
238 239 mmu_notifier_invalidate_range_start(mm, start, start + size);
239 240 err = vma->vm_ops->remap_pages(vma, start, size, pgoff);
240 241 mmu_notifier_invalidate_range_end(mm, start, start + size);
241   - if (!err) {
242   - if (vma->vm_flags & VM_LOCKED) {
243   - /*
244   - * might be mapping previously unmapped range of file
245   - */
246   - mlock_vma_pages_range(vma, start, start + size);
247   - } else if (!(flags & MAP_NONBLOCK)) {
248   - if (unlikely(has_write_lock)) {
249   - downgrade_write(&mm->mmap_sem);
250   - has_write_lock = 0;
251   - }
252   - make_pages_present(start, start+size);
253   - }
254   - }
255 242  
256 243 /*
257 244 * We can't clear VM_NONLINEAR because we'd have to do
258 245  
... ... @@ -260,10 +247,13 @@
260 247 */
261 248  
262 249 out:
  250 + vm_flags = vma->vm_flags;
263 251 if (likely(!has_write_lock))
264 252 up_read(&mm->mmap_sem);
265 253 else
266 254 up_write(&mm->mmap_sem);
  255 + if (!err && ((vm_flags & VM_LOCKED) || !(flags & MAP_NONBLOCK)))
  256 + mm_populate(start, size);
267 257  
268 258 return err;
269 259 }