diff options
Diffstat (limited to 'mm/hugetlb.c')
-rw-r--r-- | mm/hugetlb.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/mm/hugetlb.c b/mm/hugetlb.c index f7355bf2f285..9244971b6791 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c | |||
@@ -386,6 +386,9 @@ void __unmap_hugepage_range(struct vm_area_struct *vma, unsigned long start, | |||
386 | if (!ptep) | 386 | if (!ptep) |
387 | continue; | 387 | continue; |
388 | 388 | ||
389 | if (huge_pmd_unshare(mm, &address, ptep)) | ||
390 | continue; | ||
391 | |||
389 | pte = huge_ptep_get_and_clear(mm, address, ptep); | 392 | pte = huge_ptep_get_and_clear(mm, address, ptep); |
390 | if (pte_none(pte)) | 393 | if (pte_none(pte)) |
391 | continue; | 394 | continue; |
@@ -658,11 +661,14 @@ void hugetlb_change_protection(struct vm_area_struct *vma, | |||
658 | BUG_ON(address >= end); | 661 | BUG_ON(address >= end); |
659 | flush_cache_range(vma, address, end); | 662 | flush_cache_range(vma, address, end); |
660 | 663 | ||
664 | spin_lock(&vma->vm_file->f_mapping->i_mmap_lock); | ||
661 | spin_lock(&mm->page_table_lock); | 665 | spin_lock(&mm->page_table_lock); |
662 | for (; address < end; address += HPAGE_SIZE) { | 666 | for (; address < end; address += HPAGE_SIZE) { |
663 | ptep = huge_pte_offset(mm, address); | 667 | ptep = huge_pte_offset(mm, address); |
664 | if (!ptep) | 668 | if (!ptep) |
665 | continue; | 669 | continue; |
670 | if (huge_pmd_unshare(mm, &address, ptep)) | ||
671 | continue; | ||
666 | if (!pte_none(*ptep)) { | 672 | if (!pte_none(*ptep)) { |
667 | pte = huge_ptep_get_and_clear(mm, address, ptep); | 673 | pte = huge_ptep_get_and_clear(mm, address, ptep); |
668 | pte = pte_mkhuge(pte_modify(pte, newprot)); | 674 | pte = pte_mkhuge(pte_modify(pte, newprot)); |
@@ -671,6 +677,7 @@ void hugetlb_change_protection(struct vm_area_struct *vma, | |||
671 | } | 677 | } |
672 | } | 678 | } |
673 | spin_unlock(&mm->page_table_lock); | 679 | spin_unlock(&mm->page_table_lock); |
680 | spin_unlock(&vma->vm_file->f_mapping->i_mmap_lock); | ||
674 | 681 | ||
675 | flush_tlb_range(vma, start, end); | 682 | flush_tlb_range(vma, start, end); |
676 | } | 683 | } |