diff options
| -rw-r--r-- | include/asm-powerpc/pgtable-ppc64.h | 11 | ||||
| -rw-r--r-- | mm/hugetlb.c | 6 |
2 files changed, 16 insertions, 1 deletions
diff --git a/include/asm-powerpc/pgtable-ppc64.h b/include/asm-powerpc/pgtable-ppc64.h index dd4c26dc57d2..8e35c28462a0 100644 --- a/include/asm-powerpc/pgtable-ppc64.h +++ b/include/asm-powerpc/pgtable-ppc64.h @@ -311,6 +311,17 @@ static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr, old = pte_update(mm, addr, ptep, _PAGE_RW, 0); } +#define __HAVE_ARCH_HUGE_PTEP_SET_WRPROTECT +static inline void huge_ptep_set_wrprotect(struct mm_struct *mm, + unsigned long addr, pte_t *ptep) +{ + unsigned long old; + + if ((pte_val(*ptep) & _PAGE_RW) == 0) + return; + old = pte_update(mm, addr, ptep, _PAGE_RW, 1); +} + /* * We currently remove entries from the hashtable regardless of whether * the entry was young or dirty. The generic routines only flush if the diff --git a/mm/hugetlb.c b/mm/hugetlb.c index 51c9e2c01640..893558ab9ff6 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -738,6 +738,10 @@ static void set_huge_ptep_writable(struct vm_area_struct *vma, } +#ifndef __HAVE_ARCH_HUGE_PTEP_SET_WRPROTECT +#define huge_ptep_set_wrprotect ptep_set_wrprotect +#endif + int copy_hugetlb_page_range(struct mm_struct *dst, struct mm_struct *src, struct vm_area_struct *vma) { @@ -764,7 +768,7 @@ int copy_hugetlb_page_range(struct mm_struct *dst, struct mm_struct *src, spin_lock(&src->page_table_lock); if (!pte_none(*src_pte)) { if (cow) - ptep_set_wrprotect(src, addr, src_pte); + huge_ptep_set_wrprotect(src, addr, src_pte); entry = *src_pte; ptepage = pte_page(entry); get_page(ptepage); |
