[PATCH 20/64] mm/madvise: use mm locking wrappers
From: Davidlohr Buesommap_sem users are already aware of mmrange, thus a straightforward conversion. No changes in semantics. Signed-off-by: Davidlohr Bueso --- mm/madvise.c | 20 +++- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/mm/madvise.c b/mm/madvise.c index eaec6bfc2b08..de8fb035955c 100644 --- a/mm/madvise.c +++ b/mm/madvise.c @@ -532,7 +532,7 @@ static long madvise_dontneed_free(struct vm_area_struct *vma, if (!userfaultfd_remove(vma, start, end)) { *prev = NULL; /* mmap_sem has been dropped, prev is stale */ - down_read(>mm->mmap_sem); + mm_read_lock(current->mm, mmrange); vma = find_vma(current->mm, start); if (!vma) return -ENOMEM; @@ -582,7 +582,8 @@ static long madvise_dontneed_free(struct vm_area_struct *vma, */ static long madvise_remove(struct vm_area_struct *vma, struct vm_area_struct **prev, - unsigned long start, unsigned long end) + unsigned long start, unsigned long end, + struct range_lock *mmrange) { loff_t offset; int error; @@ -614,13 +615,13 @@ static long madvise_remove(struct vm_area_struct *vma, get_file(f); if (userfaultfd_remove(vma, start, end)) { /* mmap_sem was not released by userfaultfd_remove() */ - up_read(>mm->mmap_sem); + mm_read_unlock(current->mm, mmrange); } error = vfs_fallocate(f, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, offset, end - start); fput(f); - down_read(>mm->mmap_sem); + mm_read_lock(current->mm, mmrange); return error; } @@ -690,7 +691,7 @@ madvise_vma(struct vm_area_struct *vma, struct vm_area_struct **prev, { switch (behavior) { case MADV_REMOVE: - return madvise_remove(vma, prev, start, end); + return madvise_remove(vma, prev, start, end, mmrange); case MADV_WILLNEED: return madvise_willneed(vma, prev, start, end, mmrange); case MADV_FREE: @@ -809,6 +810,7 @@ SYSCALL_DEFINE3(madvise, unsigned long, start, size_t, len_in, int, behavior) int write; size_t len; struct blk_plug plug; + DEFINE_RANGE_LOCK_FULL(mmrange); if (!madvise_behavior_valid(behavior)) return error; @@ -836,10 +838,10 @@ SYSCALL_DEFINE3(madvise, unsigned long, start, size_t, len_in, int, behavior) write = madvise_need_mmap_write(behavior); if (write) { - if (down_write_killable(>mm->mmap_sem)) + if (mm_write_lock_killable(current->mm, )) return -EINTR; } else { - down_read(>mm->mmap_sem); + mm_read_lock(current->mm, ); } /* @@ -889,9 +891,9 @@ SYSCALL_DEFINE3(madvise, unsigned long, start, size_t, len_in, int, behavior) out: blk_finish_plug(); if (write) - up_write(>mm->mmap_sem); + mm_write_unlock(current->mm, ); else - up_read(>mm->mmap_sem); + mm_read_unlock(current->mm, ); return error; } -- 2.13.6
[PATCH 20/64] mm/madvise: use mm locking wrappers
From: Davidlohr Bueso mmap_sem users are already aware of mmrange, thus a straightforward conversion. No changes in semantics. Signed-off-by: Davidlohr Bueso --- mm/madvise.c | 20 +++- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/mm/madvise.c b/mm/madvise.c index eaec6bfc2b08..de8fb035955c 100644 --- a/mm/madvise.c +++ b/mm/madvise.c @@ -532,7 +532,7 @@ static long madvise_dontneed_free(struct vm_area_struct *vma, if (!userfaultfd_remove(vma, start, end)) { *prev = NULL; /* mmap_sem has been dropped, prev is stale */ - down_read(>mm->mmap_sem); + mm_read_lock(current->mm, mmrange); vma = find_vma(current->mm, start); if (!vma) return -ENOMEM; @@ -582,7 +582,8 @@ static long madvise_dontneed_free(struct vm_area_struct *vma, */ static long madvise_remove(struct vm_area_struct *vma, struct vm_area_struct **prev, - unsigned long start, unsigned long end) + unsigned long start, unsigned long end, + struct range_lock *mmrange) { loff_t offset; int error; @@ -614,13 +615,13 @@ static long madvise_remove(struct vm_area_struct *vma, get_file(f); if (userfaultfd_remove(vma, start, end)) { /* mmap_sem was not released by userfaultfd_remove() */ - up_read(>mm->mmap_sem); + mm_read_unlock(current->mm, mmrange); } error = vfs_fallocate(f, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, offset, end - start); fput(f); - down_read(>mm->mmap_sem); + mm_read_lock(current->mm, mmrange); return error; } @@ -690,7 +691,7 @@ madvise_vma(struct vm_area_struct *vma, struct vm_area_struct **prev, { switch (behavior) { case MADV_REMOVE: - return madvise_remove(vma, prev, start, end); + return madvise_remove(vma, prev, start, end, mmrange); case MADV_WILLNEED: return madvise_willneed(vma, prev, start, end, mmrange); case MADV_FREE: @@ -809,6 +810,7 @@ SYSCALL_DEFINE3(madvise, unsigned long, start, size_t, len_in, int, behavior) int write; size_t len; struct blk_plug plug; + DEFINE_RANGE_LOCK_FULL(mmrange); if (!madvise_behavior_valid(behavior)) return error; @@ -836,10 +838,10 @@ SYSCALL_DEFINE3(madvise, unsigned long, start, size_t, len_in, int, behavior) write = madvise_need_mmap_write(behavior); if (write) { - if (down_write_killable(>mm->mmap_sem)) + if (mm_write_lock_killable(current->mm, )) return -EINTR; } else { - down_read(>mm->mmap_sem); + mm_read_lock(current->mm, ); } /* @@ -889,9 +891,9 @@ SYSCALL_DEFINE3(madvise, unsigned long, start, size_t, len_in, int, behavior) out: blk_finish_plug(); if (write) - up_write(>mm->mmap_sem); + mm_write_unlock(current->mm, ); else - up_read(>mm->mmap_sem); + mm_read_unlock(current->mm, ); return error; } -- 2.13.6