hugetlb: call mmu notifiers on hugepage cow
When a copy-on-write occurs, we take one of two paths in handle_mm_fault: through handle_pte_fault for normal pages, or through hugetlb_fault for huge pages. In the normal page case, we eventually get to do_wp_page and call mmu notifiers via ptep_clear_flush_notify. There is no callout to the mmmu notifiers in the huge page case. This patch fixes that. Signed-off-by: Doug Doan <dougd@cray.com> Acked-by: Mel Gorman <mel@csn.ul.ie> Cc: Andrea Arcangeli <aarcange@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
a1b200e27c
commit
3edd4fc953
@ -2349,11 +2349,17 @@ static int hugetlb_cow(struct mm_struct *mm, struct vm_area_struct *vma,
|
||||
ptep = huge_pte_offset(mm, address & huge_page_mask(h));
|
||||
if (likely(pte_same(huge_ptep_get(ptep), pte))) {
|
||||
/* Break COW */
|
||||
mmu_notifier_invalidate_range_start(mm,
|
||||
address & huge_page_mask(h),
|
||||
(address & huge_page_mask(h)) + huge_page_size(h));
|
||||
huge_ptep_clear_flush(vma, address, ptep);
|
||||
set_huge_pte_at(mm, address, ptep,
|
||||
make_huge_pte(vma, new_page, 1));
|
||||
/* Make the old page be freed below */
|
||||
new_page = old_page;
|
||||
mmu_notifier_invalidate_range_end(mm,
|
||||
address & huge_page_mask(h),
|
||||
(address & huge_page_mask(h)) + huge_page_size(h));
|
||||
}
|
||||
page_cache_release(new_page);
|
||||
page_cache_release(old_page);
|
||||
|
Loading…
Reference in New Issue
Block a user