diff options
Diffstat (limited to 'mm/huge_memory.c')
-rw-r--r-- | mm/huge_memory.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/mm/huge_memory.c b/mm/huge_memory.c index ea5fb93a53a9..5f902e20e8c0 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c | |||
@@ -784,6 +784,28 @@ out: | |||
784 | return ret; | 784 | return ret; |
785 | } | 785 | } |
786 | 786 | ||
787 | void huge_pmd_set_accessed(struct mm_struct *mm, | ||
788 | struct vm_area_struct *vma, | ||
789 | unsigned long address, | ||
790 | pmd_t *pmd, pmd_t orig_pmd, | ||
791 | int dirty) | ||
792 | { | ||
793 | pmd_t entry; | ||
794 | unsigned long haddr; | ||
795 | |||
796 | spin_lock(&mm->page_table_lock); | ||
797 | if (unlikely(!pmd_same(*pmd, orig_pmd))) | ||
798 | goto unlock; | ||
799 | |||
800 | entry = pmd_mkyoung(orig_pmd); | ||
801 | haddr = address & HPAGE_PMD_MASK; | ||
802 | if (pmdp_set_access_flags(vma, haddr, pmd, entry, dirty)) | ||
803 | update_mmu_cache_pmd(vma, address, pmd); | ||
804 | |||
805 | unlock: | ||
806 | spin_unlock(&mm->page_table_lock); | ||
807 | } | ||
808 | |||
787 | static int do_huge_pmd_wp_page_fallback(struct mm_struct *mm, | 809 | static int do_huge_pmd_wp_page_fallback(struct mm_struct *mm, |
788 | struct vm_area_struct *vma, | 810 | struct vm_area_struct *vma, |
789 | unsigned long address, | 811 | unsigned long address, |