Message ID | 20200812063358.369514-10-aneesh.kumar@linux.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [01/16] powerpc/mm: Add DEBUG_VM WARN for pmd_clear | expand |
On 08/12/2020 12:03 PM, Aneesh Kumar K.V wrote: > Architectures like ppc64 use deposited page table while updating the huge pte > entries. > > Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com> > --- > mm/debug_vm_pgtable.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > > diff --git a/mm/debug_vm_pgtable.c b/mm/debug_vm_pgtable.c > index 644d28861ce9..48475d288df1 100644 > --- a/mm/debug_vm_pgtable.c > +++ b/mm/debug_vm_pgtable.c > @@ -147,7 +147,7 @@ static void __init pmd_basic_tests(unsigned long pfn, pgprot_t prot) > static void __init pmd_advanced_tests(struct mm_struct *mm, > struct vm_area_struct *vma, pmd_t *pmdp, > unsigned long pfn, unsigned long vaddr, > - pgprot_t prot) > + pgprot_t prot, pgtable_t pgtable) > { > pmd_t pmd; > > @@ -158,6 +158,8 @@ static void __init pmd_advanced_tests(struct mm_struct *mm, > /* Align the address wrt HPAGE_PMD_SIZE */ > vaddr = (vaddr & HPAGE_PMD_MASK) + HPAGE_PMD_SIZE; > > + pgtable_trans_huge_deposit(mm, pmdp, pgtable); > + > pmd = pmd_mkhuge(pfn_pmd(pfn, prot)); > set_pmd_at(mm, vaddr, pmdp, pmd); > pmdp_set_wrprotect(mm, vaddr, pmdp); > @@ -188,6 +190,8 @@ static void __init pmd_advanced_tests(struct mm_struct *mm, > pmdp_test_and_clear_young(vma, vaddr, pmdp); > pmd = READ_ONCE(*pmdp); > WARN_ON(pmd_young(pmd)); > + > + pgtable = pgtable_trans_huge_withdraw(mm, pmdp); > } > > static void __init pmd_leaf_tests(unsigned long pfn, pgprot_t prot) > @@ -1002,7 +1006,7 @@ static int __init debug_vm_pgtable(void) > pgd_clear_tests(mm, pgdp); > > pte_advanced_tests(mm, vma, ptep, pte_aligned, vaddr, prot); > - pmd_advanced_tests(mm, vma, pmdp, pmd_aligned, vaddr, prot); > + pmd_advanced_tests(mm, vma, pmdp, pmd_aligned, vaddr, prot, saved_ptep); > pud_advanced_tests(mm, vma, pudp, pud_aligned, vaddr, prot); > hugetlb_advanced_tests(mm, vma, ptep, pte_aligned, vaddr, prot); > > Makes sense, if it is required for THP to work correctly but needs to be tested across enabled platforms. Why should not the same apply for pud_advanced_tests() on platforms that supports PUD based THP.
On 8/13/20 10:55 AM, Anshuman Khandual wrote: > On 08/12/2020 12:03 PM, Aneesh Kumar K.V wrote: >> Architectures like ppc64 use deposited page table while updating the huge pte >> entries. >> >> Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com> >> --- >> mm/debug_vm_pgtable.c | 8 ++++++-- >> 1 file changed, 6 insertions(+), 2 deletions(-) >> >> diff --git a/mm/debug_vm_pgtable.c b/mm/debug_vm_pgtable.c >> index 644d28861ce9..48475d288df1 100644 >> --- a/mm/debug_vm_pgtable.c >> +++ b/mm/debug_vm_pgtable.c >> @@ -147,7 +147,7 @@ static void __init pmd_basic_tests(unsigned long pfn, pgprot_t prot) >> static void __init pmd_advanced_tests(struct mm_struct *mm, >> struct vm_area_struct *vma, pmd_t *pmdp, >> unsigned long pfn, unsigned long vaddr, >> - pgprot_t prot) >> + pgprot_t prot, pgtable_t pgtable) >> { >> pmd_t pmd; >> >> @@ -158,6 +158,8 @@ static void __init pmd_advanced_tests(struct mm_struct *mm, >> /* Align the address wrt HPAGE_PMD_SIZE */ >> vaddr = (vaddr & HPAGE_PMD_MASK) + HPAGE_PMD_SIZE; >> >> + pgtable_trans_huge_deposit(mm, pmdp, pgtable); >> + >> pmd = pmd_mkhuge(pfn_pmd(pfn, prot)); >> set_pmd_at(mm, vaddr, pmdp, pmd); >> pmdp_set_wrprotect(mm, vaddr, pmdp); >> @@ -188,6 +190,8 @@ static void __init pmd_advanced_tests(struct mm_struct *mm, >> pmdp_test_and_clear_young(vma, vaddr, pmdp); >> pmd = READ_ONCE(*pmdp); >> WARN_ON(pmd_young(pmd)); >> + >> + pgtable = pgtable_trans_huge_withdraw(mm, pmdp); >> } >> >> static void __init pmd_leaf_tests(unsigned long pfn, pgprot_t prot) >> @@ -1002,7 +1006,7 @@ static int __init debug_vm_pgtable(void) >> pgd_clear_tests(mm, pgdp); >> >> pte_advanced_tests(mm, vma, ptep, pte_aligned, vaddr, prot); >> - pmd_advanced_tests(mm, vma, pmdp, pmd_aligned, vaddr, prot); >> + pmd_advanced_tests(mm, vma, pmdp, pmd_aligned, vaddr, prot, saved_ptep); >> pud_advanced_tests(mm, vma, pudp, pud_aligned, vaddr, prot); >> hugetlb_advanced_tests(mm, vma, ptep, pte_aligned, vaddr, prot); >> >> > > Makes sense, if it is required for THP to work correctly but needs to be tested > across enabled platforms. Why should not the same apply for pud_advanced_tests() > on platforms that supports PUD based THP. > pud doesn't have page table deposit/withdraw semantics. We use that to support hugepage split. With pud mapping we don't split, we just drop the hugepage and expect it to be faulted back in as regular page. -aneesh
diff --git a/mm/debug_vm_pgtable.c b/mm/debug_vm_pgtable.c index 644d28861ce9..48475d288df1 100644 --- a/mm/debug_vm_pgtable.c +++ b/mm/debug_vm_pgtable.c @@ -147,7 +147,7 @@ static void __init pmd_basic_tests(unsigned long pfn, pgprot_t prot) static void __init pmd_advanced_tests(struct mm_struct *mm, struct vm_area_struct *vma, pmd_t *pmdp, unsigned long pfn, unsigned long vaddr, - pgprot_t prot) + pgprot_t prot, pgtable_t pgtable) { pmd_t pmd; @@ -158,6 +158,8 @@ static void __init pmd_advanced_tests(struct mm_struct *mm, /* Align the address wrt HPAGE_PMD_SIZE */ vaddr = (vaddr & HPAGE_PMD_MASK) + HPAGE_PMD_SIZE; + pgtable_trans_huge_deposit(mm, pmdp, pgtable); + pmd = pmd_mkhuge(pfn_pmd(pfn, prot)); set_pmd_at(mm, vaddr, pmdp, pmd); pmdp_set_wrprotect(mm, vaddr, pmdp); @@ -188,6 +190,8 @@ static void __init pmd_advanced_tests(struct mm_struct *mm, pmdp_test_and_clear_young(vma, vaddr, pmdp); pmd = READ_ONCE(*pmdp); WARN_ON(pmd_young(pmd)); + + pgtable = pgtable_trans_huge_withdraw(mm, pmdp); } static void __init pmd_leaf_tests(unsigned long pfn, pgprot_t prot) @@ -1002,7 +1006,7 @@ static int __init debug_vm_pgtable(void) pgd_clear_tests(mm, pgdp); pte_advanced_tests(mm, vma, ptep, pte_aligned, vaddr, prot); - pmd_advanced_tests(mm, vma, pmdp, pmd_aligned, vaddr, prot); + pmd_advanced_tests(mm, vma, pmdp, pmd_aligned, vaddr, prot, saved_ptep); pud_advanced_tests(mm, vma, pudp, pud_aligned, vaddr, prot); hugetlb_advanced_tests(mm, vma, ptep, pte_aligned, vaddr, prot);
Architectures like ppc64 use deposited page table while updating the huge pte entries. Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com> --- mm/debug_vm_pgtable.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)