diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2023-07-03 19:29:48 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2023-07-04 07:22:59 -0700 |
commit | b5641a5d8b8b14643bfe3d017d64da90a5c55479 (patch) | |
tree | 9e5bd4006f597e073a4faa653b83185dcfa58534 /mm | |
parent | 24be4d0b46bb0c3c1dc7bacd30957d6144a70dfc (diff) | |
download | linux-stable-b5641a5d8b8b14643bfe3d017d64da90a5c55479.tar.gz linux-stable-b5641a5d8b8b14643bfe3d017d64da90a5c55479.tar.bz2 linux-stable-b5641a5d8b8b14643bfe3d017d64da90a5c55479.zip |
mm: don't do validate_mm() unnecessarily and without mmap locking
This is an addition to commit ae80b4041984 ("mm: validate the mm before
dropping the mmap lock"), because it turns out there were two problems,
but lockdep just stopped complaining after finding the first one.
The do_vmi_align_munmap() function now drops the mmap lock after doing
the validate_mm() call, but it turns out that one of the callers then
immediately calls validate_mm() again.
That's both a bit silly, and now (again) happens without the mmap lock
held.
So just remove that validate_mm() call from the caller, but make sure to
not lose any coverage by doing that mm sanity checking in the error path
of do_vmi_align_munmap() too.
Reported-and-tested-by: kernel test robot <oliver.sang@intel.com>
Link: https://lore.kernel.org/lkml/ZKN6CdkKyxBShPHi@xsang-OptiPlex-9020/
Fixes: 408579cd627a ("mm: Update do_vmi_align_munmap() return semantics")
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm')
-rw-r--r-- | mm/mmap.c | 6 |
1 files changed, 2 insertions, 4 deletions
diff --git a/mm/mmap.c b/mm/mmap.c index 547b40531791..204ddcd52625 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -2571,6 +2571,7 @@ end_split_failed: __mt_destroy(&mt_detach); start_split_failed: map_count_exceeded: + validate_mm(mm); return error; } @@ -3019,12 +3020,9 @@ int do_vma_munmap(struct vma_iterator *vmi, struct vm_area_struct *vma, bool unlock) { struct mm_struct *mm = vma->vm_mm; - int ret; arch_unmap(mm, start, end); - ret = do_vmi_align_munmap(vmi, vma, mm, start, end, uf, unlock); - validate_mm(mm); - return ret; + return do_vmi_align_munmap(vmi, vma, mm, start, end, uf, unlock); } /* |