Re: [PATCH V2 1/3] mm/debug: Add tests validating arch page table helpers for core features
On 25 Mar 2020, at 22:18, Anshuman Khandual wrote: > External email: Use caution opening links or attachments > > > On 03/24/2020 06:59 PM, Zi Yan wrote: >> On 24 Mar 2020, at 1:22, Anshuman Khandual wrote: >> >>> This adds new tests validating arch page table helpers for these following >>> core memory features. These tests create and test specific mapping types at >>> various page table levels. >>> >>> 1. SPECIAL mapping >>> 2. PROTNONE mapping >>> 3. DEVMAP mapping >>> 4. SOFTDIRTY mapping >>> 5. SWAP mapping >>> 6. MIGRATION mapping >>> 7. HUGETLB mapping >>> 8. THP mapping >>> >>> Cc: Andrew Morton >>> Cc: Mike Rapoport >>> Cc: Vineet Gupta >>> Cc: Catalin Marinas >>> Cc: Will Deacon >>> Cc: Benjamin Herrenschmidt >>> Cc: Paul Mackerras >>> Cc: Michael Ellerman >>> Cc: Heiko Carstens >>> Cc: Vasily Gorbik >>> Cc: Christian Borntraeger >>> Cc: Thomas Gleixner >>> Cc: Ingo Molnar >>> Cc: Borislav Petkov >>> Cc: "H. Peter Anvin" >>> Cc: Kirill A. Shutemov >>> Cc: Paul Walmsley >>> Cc: Palmer Dabbelt >>> Cc: linux-snps-...@lists.infradead.org >>> Cc: linux-arm-ker...@lists.infradead.org >>> Cc: linuxppc-dev@lists.ozlabs.org >>> Cc: linux-s...@vger.kernel.org >>> Cc: linux-ri...@lists.infradead.org >>> Cc: x...@kernel.org >>> Cc: linux-a...@vger.kernel.org >>> Cc: linux-ker...@vger.kernel.org >>> Suggested-by: Catalin Marinas >>> Signed-off-by: Anshuman Khandual >>> --- >>> mm/debug_vm_pgtable.c | 291 +- >>> 1 file changed, 290 insertions(+), 1 deletion(-) >>> >>> diff --git a/mm/debug_vm_pgtable.c b/mm/debug_vm_pgtable.c >>> index 98990a515268..15055a8f6478 100644 >>> --- a/mm/debug_vm_pgtable.c >>> +++ b/mm/debug_vm_pgtable.c >>> @@ -289,6 +289,267 @@ static void __init pmd_populate_tests(struct >>> mm_struct *mm, pmd_t *pmdp, >>> WARN_ON(pmd_bad(pmd)); >>> } >>> >>> +static void __init pte_special_tests(unsigned long pfn, pgprot_t prot) >>> +{ >>> +pte_t pte = pfn_pte(pfn, prot); >>> + >>> +if (!IS_ENABLED(CONFIG_ARCH_HAS_PTE_SPECIAL)) >>> +return; >>> + >>> +WARN_ON(!pte_special(pte_mkspecial(pte))); >>> +} >>> + >>> +static void __init pte_protnone_tests(unsigned long pfn, pgprot_t prot) >>> +{ >>> +pte_t pte = pfn_pte(pfn, prot); >>> + >>> +if (!IS_ENABLED(CONFIG_NUMA_BALANCING)) >>> +return; >>> + >>> +WARN_ON(!pte_protnone(pte)); >>> +WARN_ON(!pte_present(pte)); >>> +} >>> + >>> +#ifdef CONFIG_TRANSPARENT_HUGEPAGE >>> +static void __init pmd_protnone_tests(unsigned long pfn, pgprot_t prot) >>> +{ >>> +pmd_t pmd = pfn_pmd(pfn, prot); >>> + >>> +if (!IS_ENABLED(CONFIG_NUMA_BALANCING)) >>> +return; >>> + >>> +WARN_ON(!pmd_protnone(pmd)); >>> +WARN_ON(!pmd_present(pmd)); >>> +} >>> +#else >>> +static void __init pmd_protnone_tests(unsigned long pfn, pgprot_t prot) { } >>> +#endif >>> + >>> +#ifdef CONFIG_ARCH_HAS_PTE_DEVMAP >>> +static void __init pte_devmap_tests(unsigned long pfn, pgprot_t prot) >>> +{ >>> +pte_t pte = pfn_pte(pfn, prot); >>> + >>> +WARN_ON(!pte_devmap(pte_mkdevmap(pte))); >>> +} >>> + >>> +#ifdef CONFIG_TRANSPARENT_HUGEPAGE >>> +static void __init pmd_devmap_tests(unsigned long pfn, pgprot_t prot) >>> +{ >>> +pmd_t pmd = pfn_pmd(pfn, prot); >>> + >>> +WARN_ON(!pmd_devmap(pmd_mkdevmap(pmd))); >>> +} >>> + >>> +#ifdef CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD >>> +static void __init pud_devmap_tests(unsigned long pfn, pgprot_t prot) >>> +{ >>> +pud_t pud = pfn_pud(pfn, prot); >>> + >>> +WARN_ON(!pud_devmap(pud_mkdevmap(pud))); >>> +} >>> +#else >>> +static void __init pud_devmap_tests(unsigned long pfn, pgprot_t prot) { } >>> +#endif >>> +#else >>> +static void __init pmd_devmap_tests(unsigned long pfn, pgprot_t prot) { } >>> +static void __init pud_devmap_tests(unsigned long pfn, pgprot_t prot) { } >>> +#endif >>> +#else >>> +static void __init pte_devmap_tests(unsigned long pfn, pgprot_t prot) { } >>> +static void __init pmd_devmap_tests(unsigned long pfn, pgprot_t prot) { } >>> +static void __init pud_devmap_tests(unsigned long pfn, pgprot_t prot) { } >>> +#endif >>> + >>> +static void __init pte_soft_dirty_tests(unsigned long pfn, pgprot_t prot) >>> +{ >>> +pte_t pte = pfn_pte(pfn, prot); >>> + >>> +if (!IS_ENABLED(CONFIG_HAVE_ARCH_SOFT_DIRTY)) >>> +return; >>> + >>> +WARN_ON(!pte_soft_dirty(pte_mksoft_dirty(pte))); >>> +WARN_ON(pte_soft_dirty(pte_clear_soft_dirty(pte))); >>> +} >>> + >>> +static void __init pte_swap_soft_dirty_tests(unsigned long pfn, pgprot_t >>> prot) >>> +{ >>> +pte_t pte = pfn_pte(pfn, prot); >>> + >>> +if (!IS_ENABLED(CONFIG_HAVE_ARCH_SOFT_DIRTY)) >>> +return; >>> + >>> +WARN_ON(!pte_swp_soft_dirty(pte_swp_mksoft_dirty(pte))); >>> +WARN_ON(pte_swp_soft_dirty(pte_swp_clear_soft_dirty(pte))); >>> +} >>> + >>> +#ifdef CONFIG_TRANSPARENT_HUGEPAGE >>> +static void __init pmd_soft_dirty_tests(unsigned long pfn, pgprot_t prot) >>> +{ >>>
Re: [PATCH V2 1/3] mm/debug: Add tests validating arch page table helpers for core features
On 03/24/2020 06:59 PM, Zi Yan wrote: > On 24 Mar 2020, at 1:22, Anshuman Khandual wrote: > >> This adds new tests validating arch page table helpers for these following >> core memory features. These tests create and test specific mapping types at >> various page table levels. >> >> 1. SPECIAL mapping >> 2. PROTNONE mapping >> 3. DEVMAP mapping >> 4. SOFTDIRTY mapping >> 5. SWAP mapping >> 6. MIGRATION mapping >> 7. HUGETLB mapping >> 8. THP mapping >> >> Cc: Andrew Morton >> Cc: Mike Rapoport >> Cc: Vineet Gupta >> Cc: Catalin Marinas >> Cc: Will Deacon >> Cc: Benjamin Herrenschmidt >> Cc: Paul Mackerras >> Cc: Michael Ellerman >> Cc: Heiko Carstens >> Cc: Vasily Gorbik >> Cc: Christian Borntraeger >> Cc: Thomas Gleixner >> Cc: Ingo Molnar >> Cc: Borislav Petkov >> Cc: "H. Peter Anvin" >> Cc: Kirill A. Shutemov >> Cc: Paul Walmsley >> Cc: Palmer Dabbelt >> Cc: linux-snps-...@lists.infradead.org >> Cc: linux-arm-ker...@lists.infradead.org >> Cc: linuxppc-dev@lists.ozlabs.org >> Cc: linux-s...@vger.kernel.org >> Cc: linux-ri...@lists.infradead.org >> Cc: x...@kernel.org >> Cc: linux-a...@vger.kernel.org >> Cc: linux-ker...@vger.kernel.org >> Suggested-by: Catalin Marinas >> Signed-off-by: Anshuman Khandual >> --- >> mm/debug_vm_pgtable.c | 291 +- >> 1 file changed, 290 insertions(+), 1 deletion(-) >> >> diff --git a/mm/debug_vm_pgtable.c b/mm/debug_vm_pgtable.c >> index 98990a515268..15055a8f6478 100644 >> --- a/mm/debug_vm_pgtable.c >> +++ b/mm/debug_vm_pgtable.c >> @@ -289,6 +289,267 @@ static void __init pmd_populate_tests(struct mm_struct >> *mm, pmd_t *pmdp, >> WARN_ON(pmd_bad(pmd)); >> } >> >> +static void __init pte_special_tests(unsigned long pfn, pgprot_t prot) >> +{ >> +pte_t pte = pfn_pte(pfn, prot); >> + >> +if (!IS_ENABLED(CONFIG_ARCH_HAS_PTE_SPECIAL)) >> +return; >> + >> +WARN_ON(!pte_special(pte_mkspecial(pte))); >> +} >> + >> +static void __init pte_protnone_tests(unsigned long pfn, pgprot_t prot) >> +{ >> +pte_t pte = pfn_pte(pfn, prot); >> + >> +if (!IS_ENABLED(CONFIG_NUMA_BALANCING)) >> +return; >> + >> +WARN_ON(!pte_protnone(pte)); >> +WARN_ON(!pte_present(pte)); >> +} >> + >> +#ifdef CONFIG_TRANSPARENT_HUGEPAGE >> +static void __init pmd_protnone_tests(unsigned long pfn, pgprot_t prot) >> +{ >> +pmd_t pmd = pfn_pmd(pfn, prot); >> + >> +if (!IS_ENABLED(CONFIG_NUMA_BALANCING)) >> +return; >> + >> +WARN_ON(!pmd_protnone(pmd)); >> +WARN_ON(!pmd_present(pmd)); >> +} >> +#else >> +static void __init pmd_protnone_tests(unsigned long pfn, pgprot_t prot) { } >> +#endif >> + >> +#ifdef CONFIG_ARCH_HAS_PTE_DEVMAP >> +static void __init pte_devmap_tests(unsigned long pfn, pgprot_t prot) >> +{ >> +pte_t pte = pfn_pte(pfn, prot); >> + >> +WARN_ON(!pte_devmap(pte_mkdevmap(pte))); >> +} >> + >> +#ifdef CONFIG_TRANSPARENT_HUGEPAGE >> +static void __init pmd_devmap_tests(unsigned long pfn, pgprot_t prot) >> +{ >> +pmd_t pmd = pfn_pmd(pfn, prot); >> + >> +WARN_ON(!pmd_devmap(pmd_mkdevmap(pmd))); >> +} >> + >> +#ifdef CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD >> +static void __init pud_devmap_tests(unsigned long pfn, pgprot_t prot) >> +{ >> +pud_t pud = pfn_pud(pfn, prot); >> + >> +WARN_ON(!pud_devmap(pud_mkdevmap(pud))); >> +} >> +#else >> +static void __init pud_devmap_tests(unsigned long pfn, pgprot_t prot) { } >> +#endif >> +#else >> +static void __init pmd_devmap_tests(unsigned long pfn, pgprot_t prot) { } >> +static void __init pud_devmap_tests(unsigned long pfn, pgprot_t prot) { } >> +#endif >> +#else >> +static void __init pte_devmap_tests(unsigned long pfn, pgprot_t prot) { } >> +static void __init pmd_devmap_tests(unsigned long pfn, pgprot_t prot) { } >> +static void __init pud_devmap_tests(unsigned long pfn, pgprot_t prot) { } >> +#endif >> + >> +static void __init pte_soft_dirty_tests(unsigned long pfn, pgprot_t prot) >> +{ >> +pte_t pte = pfn_pte(pfn, prot); >> + >> +if (!IS_ENABLED(CONFIG_HAVE_ARCH_SOFT_DIRTY)) >> +return; >> + >> +WARN_ON(!pte_soft_dirty(pte_mksoft_dirty(pte))); >> +WARN_ON(pte_soft_dirty(pte_clear_soft_dirty(pte))); >> +} >> + >> +static void __init pte_swap_soft_dirty_tests(unsigned long pfn, pgprot_t >> prot) >> +{ >> +pte_t pte = pfn_pte(pfn, prot); >> + >> +if (!IS_ENABLED(CONFIG_HAVE_ARCH_SOFT_DIRTY)) >> +return; >> + >> +WARN_ON(!pte_swp_soft_dirty(pte_swp_mksoft_dirty(pte))); >> +WARN_ON(pte_swp_soft_dirty(pte_swp_clear_soft_dirty(pte))); >> +} >> + >> +#ifdef CONFIG_TRANSPARENT_HUGEPAGE >> +static void __init pmd_soft_dirty_tests(unsigned long pfn, pgprot_t prot) >> +{ >> +pmd_t pmd = pfn_pmd(pfn, prot); >> + >> +if (!IS_ENABLED(CONFIG_HAVE_ARCH_SOFT_DIRTY)) >> +return; >> + >> +WARN_ON(!pmd_soft_dirty(pmd_mksoft_dirty(pmd))); >> +WARN_ON(pmd_soft_dirty(pmd_clear_soft_dirty(pmd))); >> +} >> + >> +static void
Re: [PATCH V2 1/3] mm/debug: Add tests validating arch page table helpers for core features
On 24 Mar 2020, at 1:22, Anshuman Khandual wrote: > This adds new tests validating arch page table helpers for these following > core memory features. These tests create and test specific mapping types at > various page table levels. > > 1. SPECIAL mapping > 2. PROTNONE mapping > 3. DEVMAP mapping > 4. SOFTDIRTY mapping > 5. SWAP mapping > 6. MIGRATION mapping > 7. HUGETLB mapping > 8. THP mapping > > Cc: Andrew Morton > Cc: Mike Rapoport > Cc: Vineet Gupta > Cc: Catalin Marinas > Cc: Will Deacon > Cc: Benjamin Herrenschmidt > Cc: Paul Mackerras > Cc: Michael Ellerman > Cc: Heiko Carstens > Cc: Vasily Gorbik > Cc: Christian Borntraeger > Cc: Thomas Gleixner > Cc: Ingo Molnar > Cc: Borislav Petkov > Cc: "H. Peter Anvin" > Cc: Kirill A. Shutemov > Cc: Paul Walmsley > Cc: Palmer Dabbelt > Cc: linux-snps-...@lists.infradead.org > Cc: linux-arm-ker...@lists.infradead.org > Cc: linuxppc-dev@lists.ozlabs.org > Cc: linux-s...@vger.kernel.org > Cc: linux-ri...@lists.infradead.org > Cc: x...@kernel.org > Cc: linux-a...@vger.kernel.org > Cc: linux-ker...@vger.kernel.org > Suggested-by: Catalin Marinas > Signed-off-by: Anshuman Khandual > --- > mm/debug_vm_pgtable.c | 291 +- > 1 file changed, 290 insertions(+), 1 deletion(-) > > diff --git a/mm/debug_vm_pgtable.c b/mm/debug_vm_pgtable.c > index 98990a515268..15055a8f6478 100644 > --- a/mm/debug_vm_pgtable.c > +++ b/mm/debug_vm_pgtable.c > @@ -289,6 +289,267 @@ static void __init pmd_populate_tests(struct mm_struct > *mm, pmd_t *pmdp, > WARN_ON(pmd_bad(pmd)); > } > > +static void __init pte_special_tests(unsigned long pfn, pgprot_t prot) > +{ > + pte_t pte = pfn_pte(pfn, prot); > + > + if (!IS_ENABLED(CONFIG_ARCH_HAS_PTE_SPECIAL)) > + return; > + > + WARN_ON(!pte_special(pte_mkspecial(pte))); > +} > + > +static void __init pte_protnone_tests(unsigned long pfn, pgprot_t prot) > +{ > + pte_t pte = pfn_pte(pfn, prot); > + > + if (!IS_ENABLED(CONFIG_NUMA_BALANCING)) > + return; > + > + WARN_ON(!pte_protnone(pte)); > + WARN_ON(!pte_present(pte)); > +} > + > +#ifdef CONFIG_TRANSPARENT_HUGEPAGE > +static void __init pmd_protnone_tests(unsigned long pfn, pgprot_t prot) > +{ > + pmd_t pmd = pfn_pmd(pfn, prot); > + > + if (!IS_ENABLED(CONFIG_NUMA_BALANCING)) > + return; > + > + WARN_ON(!pmd_protnone(pmd)); > + WARN_ON(!pmd_present(pmd)); > +} > +#else > +static void __init pmd_protnone_tests(unsigned long pfn, pgprot_t prot) { } > +#endif > + > +#ifdef CONFIG_ARCH_HAS_PTE_DEVMAP > +static void __init pte_devmap_tests(unsigned long pfn, pgprot_t prot) > +{ > + pte_t pte = pfn_pte(pfn, prot); > + > + WARN_ON(!pte_devmap(pte_mkdevmap(pte))); > +} > + > +#ifdef CONFIG_TRANSPARENT_HUGEPAGE > +static void __init pmd_devmap_tests(unsigned long pfn, pgprot_t prot) > +{ > + pmd_t pmd = pfn_pmd(pfn, prot); > + > + WARN_ON(!pmd_devmap(pmd_mkdevmap(pmd))); > +} > + > +#ifdef CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD > +static void __init pud_devmap_tests(unsigned long pfn, pgprot_t prot) > +{ > + pud_t pud = pfn_pud(pfn, prot); > + > + WARN_ON(!pud_devmap(pud_mkdevmap(pud))); > +} > +#else > +static void __init pud_devmap_tests(unsigned long pfn, pgprot_t prot) { } > +#endif > +#else > +static void __init pmd_devmap_tests(unsigned long pfn, pgprot_t prot) { } > +static void __init pud_devmap_tests(unsigned long pfn, pgprot_t prot) { } > +#endif > +#else > +static void __init pte_devmap_tests(unsigned long pfn, pgprot_t prot) { } > +static void __init pmd_devmap_tests(unsigned long pfn, pgprot_t prot) { } > +static void __init pud_devmap_tests(unsigned long pfn, pgprot_t prot) { } > +#endif > + > +static void __init pte_soft_dirty_tests(unsigned long pfn, pgprot_t prot) > +{ > + pte_t pte = pfn_pte(pfn, prot); > + > + if (!IS_ENABLED(CONFIG_HAVE_ARCH_SOFT_DIRTY)) > + return; > + > + WARN_ON(!pte_soft_dirty(pte_mksoft_dirty(pte))); > + WARN_ON(pte_soft_dirty(pte_clear_soft_dirty(pte))); > +} > + > +static void __init pte_swap_soft_dirty_tests(unsigned long pfn, pgprot_t > prot) > +{ > + pte_t pte = pfn_pte(pfn, prot); > + > + if (!IS_ENABLED(CONFIG_HAVE_ARCH_SOFT_DIRTY)) > + return; > + > + WARN_ON(!pte_swp_soft_dirty(pte_swp_mksoft_dirty(pte))); > + WARN_ON(pte_swp_soft_dirty(pte_swp_clear_soft_dirty(pte))); > +} > + > +#ifdef CONFIG_TRANSPARENT_HUGEPAGE > +static void __init pmd_soft_dirty_tests(unsigned long pfn, pgprot_t prot) > +{ > + pmd_t pmd = pfn_pmd(pfn, prot); > + > + if (!IS_ENABLED(CONFIG_HAVE_ARCH_SOFT_DIRTY)) > + return; > + > + WARN_ON(!pmd_soft_dirty(pmd_mksoft_dirty(pmd))); > + WARN_ON(pmd_soft_dirty(pmd_clear_soft_dirty(pmd))); > +} > + > +static void __init pmd_swap_soft_dirty_tests(unsigned long pfn, pgprot_t > prot) > +{ > + pmd_t pmd = pfn_pmd(pfn, prot); > + > + if (!IS_ENABLED(CONFIG_HAVE_ARCH_SOFT_DIRTY