[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
@@ -1673,9 +1673,7 @@ static void unmap_region(struct mm_struct *mm,
|
||||
lru_add_drain();
|
||||
tlb = tlb_gather_mmu(mm, 0);
|
||||
update_hiwater_rss(mm);
|
||||
spin_lock(&mm->page_table_lock);
|
||||
unmap_vmas(&tlb, mm, vma, start, end, &nr_accounted, NULL);
|
||||
spin_unlock(&mm->page_table_lock);
|
||||
unmap_vmas(&tlb, vma, start, end, &nr_accounted, NULL);
|
||||
vm_unacct_memory(nr_accounted);
|
||||
free_pgtables(&tlb, vma, prev? prev->vm_end: FIRST_USER_ADDRESS,
|
||||
next? next->vm_start: 0);
|
||||
@@ -1958,9 +1956,7 @@ void exit_mmap(struct mm_struct *mm)
|
||||
tlb = tlb_gather_mmu(mm, 1);
|
||||
/* Don't update_hiwater_rss(mm) here, do_exit already did */
|
||||
/* Use -1 here to ensure all VMAs in the mm are unmapped */
|
||||
spin_lock(&mm->page_table_lock);
|
||||
end = unmap_vmas(&tlb, mm, vma, 0, -1, &nr_accounted, NULL);
|
||||
spin_unlock(&mm->page_table_lock);
|
||||
end = unmap_vmas(&tlb, vma, 0, -1, &nr_accounted, NULL);
|
||||
vm_unacct_memory(nr_accounted);
|
||||
free_pgtables(&tlb, vma, FIRST_USER_ADDRESS, 0);
|
||||
tlb_finish_mmu(tlb, 0, end);
|
||||
|
Reference in New Issue
Block a user