"Aneesh Kumar K.V" <aneesh.kumar@xxxxxxxxxxxxx> writes: > Architectures like ppc64 require to do a conditional tlb flush based on the old > and new value of pte. Follow the regular pte change protection sequence for > hugetlb too. This allows the architectures to override the update sequence. > > Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@xxxxxxxxxxxxx> > --- > include/linux/hugetlb.h | 20 ++++++++++++++++++++ > mm/hugetlb.c | 8 +++++--- > 2 files changed, 25 insertions(+), 3 deletions(-) > > diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h > index 087fd5f48c91..39e78b80375c 100644 > --- a/include/linux/hugetlb.h > +++ b/include/linux/hugetlb.h > @@ -543,6 +543,26 @@ static inline void set_huge_swap_pte_at(struct mm_struct *mm, unsigned long addr > set_huge_pte_at(mm, addr, ptep, pte); > } > #endif > + > +#ifndef huge_ptep_modify_prot_start > +#define huge_ptep_modify_prot_start huge_ptep_modify_prot_start > +static inline pte_t huge_ptep_modify_prot_start(struct vm_area_struct *vma, > + unsigned long addr, pte_t *ptep) > +{ > + return huge_ptep_get_and_clear(vma->vm_mm, addr, ptep); > +} > +#endif > + > +#ifndef huge_ptep_modify_prot_commit > +#define huge_ptep_modify_prot_commit huge_ptep_modify_prot_commit > +static inline void huge_ptep_modify_prot_commit(struct vm_area_struct *vma, > + unsigned long addr, pte_t *ptep, > + pte_t old_pte, pte_t pte) > +{ > + set_huge_pte_at(vma->vm_mm, addr, ptep, pte); > +} > +#endif > + > #else /* CONFIG_HUGETLB_PAGE */ > struct hstate {}; > #define alloc_huge_page(v, a, r) NULL > diff --git a/mm/hugetlb.c b/mm/hugetlb.c > index df2e7dd5ff17..f824d2200ca9 100644 > --- a/mm/hugetlb.c > +++ b/mm/hugetlb.c > @@ -4387,10 +4387,12 @@ unsigned long hugetlb_change_protection(struct vm_area_struct *vma, > continue; > } > if (!huge_pte_none(pte)) { > - pte = huge_ptep_get_and_clear(mm, address, ptep); > - pte = pte_mkhuge(huge_pte_modify(pte, newprot)); > + pte_t old_pte; > + > + old_pte = huge_ptep_modify_prot_start(vma, address, ptep); > + pte = pte_mkhuge(huge_pte_modify(old_pte, newprot)); > pte = arch_make_huge_pte(pte, vma, NULL, 0); > - set_huge_pte_at(mm, address, ptep, pte); > + huge_ptep_modify_prot_commit(vma, address, ptep, old_pte, pte); > pages++; > } > spin_unlock(ptl); Looks like a faithful conversion. Reviewed-by: Michael Ellerman <mpe@xxxxxxxxxxxxxx> cheers