summaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
authorNadav Amit <namit@vmware.com>2021-11-21 21:40:08 +0100
committerLinus Torvalds <torvalds@linux-foundation.org>2021-11-22 20:36:46 +0100
commit13e4ad2ce8df6e058ef482a31fdd81c725b0f7ea (patch)
treef299abe211d8fdb36b2134fc739fbb5880cebacb /mm
parenthugetlbfs: flush TLBs correctly after huge_pmd_unshare (diff)
downloadlinux-13e4ad2ce8df6e058ef482a31fdd81c725b0f7ea.tar.xz
linux-13e4ad2ce8df6e058ef482a31fdd81c725b0f7ea.zip
hugetlbfs: flush before unlock on move_hugetlb_page_tables()
We must flush the TLB before releasing i_mmap_rwsem to avoid the potential reuse of an unshared PMDs page. This is not true in the case of move_hugetlb_page_tables(). The last reference on the page table can therefore be dropped before the TLB flush took place. Prevent it by reordering the operations and flushing the TLB before releasing i_mmap_rwsem. Fixes: 550a7d60bd5e ("mm, hugepages: add mremap() support for hugepage backed vma") Signed-off-by: Nadav Amit <namit@vmware.com> Reviewed-by: Mike Kravetz <mike.kravetz@oracle.com> Cc: Mina Almasry <almasrymina@google.com> Cc: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm')
-rw-r--r--mm/hugetlb.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/mm/hugetlb.c b/mm/hugetlb.c
index 2ccebe1ca9f4..abcd1785c629 100644
--- a/mm/hugetlb.c
+++ b/mm/hugetlb.c
@@ -4919,9 +4919,9 @@ int move_hugetlb_page_tables(struct vm_area_struct *vma,
move_huge_pte(vma, old_addr, new_addr, src_pte);
}
- i_mmap_unlock_write(mapping);
flush_tlb_range(vma, old_end - len, old_end);
mmu_notifier_invalidate_range_end(&range);
+ i_mmap_unlock_write(mapping);
return len + old_addr - old_end;
}