Commit a1ea9549a7254b17ba85809f4a0200abc21453a2
Committed by
Linus Torvalds
1 parent
bebeb3d68b
Exists in
master
and in
20 other branches
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
mm/fremap.c
... | ... | @@ -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 | } |