[PATCH] mm: unmap_vmas with inner ptlock
Remove the page_table_lock from around the calls to unmap_vmas, and replace the pte_offset_map in zap_pte_range by pte_offset_map_lock: all callers are now safe to descend without page_table_lock. Don't attempt fancy locking for hugepages, just take page_table_lock in unmap_hugepage_range. Which makes zap_hugepage_range, and the hugetlb test in zap_page_range, redundant: unmap_vmas calls unmap_hugepage_range anyway. Nor does unmap_vmas have much use for its mm arg now. The tlb_start_vma and tlb_end_vma in unmap_page_range are now called without page_table_lock: if they're implemented at all, they typically come down to flush_cache_range (usually done outside page_table_lock) and flush_tlb_range (which we already audited for the mprotect case). Signed-off-by: Hugh Dickins <hugh@veritas.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
committed by
Linus Torvalds
parent
8f4f8c164c
commit
508034a32b
@@ -92,7 +92,7 @@ out:
|
||||
}
|
||||
|
||||
/*
|
||||
* Called under down_write(mmap_sem), page_table_lock is not held
|
||||
* Called under down_write(mmap_sem).
|
||||
*/
|
||||
|
||||
#ifdef HAVE_ARCH_HUGETLB_UNMAPPED_AREA
|
||||
@@ -308,7 +308,6 @@ hugetlb_vmtruncate_list(struct prio_tree_root *root, unsigned long h_pgoff)
|
||||
|
||||
vma_prio_tree_foreach(vma, &iter, root, h_pgoff, ULONG_MAX) {
|
||||
unsigned long h_vm_pgoff;
|
||||
unsigned long v_length;
|
||||
unsigned long v_offset;
|
||||
|
||||
h_vm_pgoff = vma->vm_pgoff >> (HPAGE_SHIFT - PAGE_SHIFT);
|
||||
@@ -319,11 +318,8 @@ hugetlb_vmtruncate_list(struct prio_tree_root *root, unsigned long h_pgoff)
|
||||
if (h_vm_pgoff >= h_pgoff)
|
||||
v_offset = 0;
|
||||
|
||||
v_length = vma->vm_end - vma->vm_start;
|
||||
|
||||
zap_hugepage_range(vma,
|
||||
vma->vm_start + v_offset,
|
||||
v_length - v_offset);
|
||||
unmap_hugepage_range(vma,
|
||||
vma->vm_start + v_offset, vma->vm_end);
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user