forked from Minki/linux
mm/debug_vm_pgtable: use struct pgtable_debug_args in basic tests
This uses struct pgtable_debug_args in the basic test functions. The unused variables @pgd_aligned and @p4d_aligned in debug_vm_pgtable() are dropped. Link: https://lkml.kernel.org/r/20210809092631.1888748-3-gshan@redhat.com Signed-off-by: Gavin Shan <gshan@redhat.com> Reviewed-by: Anshuman Khandual <anshuman.khandual@arm.com> Tested-by: Christophe Leroy <christophe.leroy@csgroup.eu> [powerpc 8xx] Tested-by: Gerald Schaefer <gerald.schaefer@linux.ibm.com> [s390] Cc: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Chunyu Hu <chuhu@redhat.com> Cc: Qian Cai <cai@lca.pw> Cc: Vineet Gupta <vgupta@synopsys.com> Cc: Will Deacon <will@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
3c9b84f044
commit
36b77d1e15
@ -89,10 +89,10 @@ struct pgtable_debug_args {
|
|||||||
unsigned long fixed_pte_pfn;
|
unsigned long fixed_pte_pfn;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void __init pte_basic_tests(unsigned long pfn, int idx)
|
static void __init pte_basic_tests(struct pgtable_debug_args *args, int idx)
|
||||||
{
|
{
|
||||||
pgprot_t prot = protection_map[idx];
|
pgprot_t prot = protection_map[idx];
|
||||||
pte_t pte = pfn_pte(pfn, prot);
|
pte_t pte = pfn_pte(args->fixed_pte_pfn, prot);
|
||||||
unsigned long val = idx, *ptr = &val;
|
unsigned long val = idx, *ptr = &val;
|
||||||
|
|
||||||
pr_debug("Validating PTE basic (%pGv)\n", ptr);
|
pr_debug("Validating PTE basic (%pGv)\n", ptr);
|
||||||
@ -174,7 +174,7 @@ static void __init pte_savedwrite_tests(unsigned long pfn, pgprot_t prot)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
|
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
|
||||||
static void __init pmd_basic_tests(unsigned long pfn, int idx)
|
static void __init pmd_basic_tests(struct pgtable_debug_args *args, int idx)
|
||||||
{
|
{
|
||||||
pgprot_t prot = protection_map[idx];
|
pgprot_t prot = protection_map[idx];
|
||||||
unsigned long val = idx, *ptr = &val;
|
unsigned long val = idx, *ptr = &val;
|
||||||
@ -184,7 +184,7 @@ static void __init pmd_basic_tests(unsigned long pfn, int idx)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
pr_debug("Validating PMD basic (%pGv)\n", ptr);
|
pr_debug("Validating PMD basic (%pGv)\n", ptr);
|
||||||
pmd = pfn_pmd(pfn, prot);
|
pmd = pfn_pmd(args->fixed_pmd_pfn, prot);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This test needs to be executed after the given page table entry
|
* This test needs to be executed after the given page table entry
|
||||||
@ -296,7 +296,7 @@ static void __init pmd_savedwrite_tests(unsigned long pfn, pgprot_t prot)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD
|
#ifdef CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD
|
||||||
static void __init pud_basic_tests(struct mm_struct *mm, unsigned long pfn, int idx)
|
static void __init pud_basic_tests(struct pgtable_debug_args *args, int idx)
|
||||||
{
|
{
|
||||||
pgprot_t prot = protection_map[idx];
|
pgprot_t prot = protection_map[idx];
|
||||||
unsigned long val = idx, *ptr = &val;
|
unsigned long val = idx, *ptr = &val;
|
||||||
@ -306,7 +306,7 @@ static void __init pud_basic_tests(struct mm_struct *mm, unsigned long pfn, int
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
pr_debug("Validating PUD basic (%pGv)\n", ptr);
|
pr_debug("Validating PUD basic (%pGv)\n", ptr);
|
||||||
pud = pfn_pud(pfn, prot);
|
pud = pfn_pud(args->fixed_pud_pfn, prot);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This test needs to be executed after the given page table entry
|
* This test needs to be executed after the given page table entry
|
||||||
@ -327,7 +327,7 @@ static void __init pud_basic_tests(struct mm_struct *mm, unsigned long pfn, int
|
|||||||
WARN_ON(pud_dirty(pud_wrprotect(pud_mkclean(pud))));
|
WARN_ON(pud_dirty(pud_wrprotect(pud_mkclean(pud))));
|
||||||
WARN_ON(!pud_dirty(pud_wrprotect(pud_mkdirty(pud))));
|
WARN_ON(!pud_dirty(pud_wrprotect(pud_mkdirty(pud))));
|
||||||
|
|
||||||
if (mm_pmd_folded(mm))
|
if (mm_pmd_folded(args->mm))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -404,7 +404,7 @@ static void __init pud_leaf_tests(unsigned long pfn, pgprot_t prot)
|
|||||||
WARN_ON(!pud_leaf(pud));
|
WARN_ON(!pud_leaf(pud));
|
||||||
}
|
}
|
||||||
#else /* !CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD */
|
#else /* !CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD */
|
||||||
static void __init pud_basic_tests(struct mm_struct *mm, unsigned long pfn, int idx) { }
|
static void __init pud_basic_tests(struct pgtable_debug_args *args, int idx) { }
|
||||||
static void __init pud_advanced_tests(struct mm_struct *mm,
|
static void __init pud_advanced_tests(struct mm_struct *mm,
|
||||||
struct vm_area_struct *vma, pud_t *pudp,
|
struct vm_area_struct *vma, pud_t *pudp,
|
||||||
unsigned long pfn, unsigned long vaddr,
|
unsigned long pfn, unsigned long vaddr,
|
||||||
@ -414,8 +414,8 @@ static void __init pud_advanced_tests(struct mm_struct *mm,
|
|||||||
static void __init pud_leaf_tests(unsigned long pfn, pgprot_t prot) { }
|
static void __init pud_leaf_tests(unsigned long pfn, pgprot_t prot) { }
|
||||||
#endif /* CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD */
|
#endif /* CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD */
|
||||||
#else /* !CONFIG_TRANSPARENT_HUGEPAGE */
|
#else /* !CONFIG_TRANSPARENT_HUGEPAGE */
|
||||||
static void __init pmd_basic_tests(unsigned long pfn, int idx) { }
|
static void __init pmd_basic_tests(struct pgtable_debug_args *args, int idx) { }
|
||||||
static void __init pud_basic_tests(struct mm_struct *mm, unsigned long pfn, int idx) { }
|
static void __init pud_basic_tests(struct pgtable_debug_args *args, int idx) { }
|
||||||
static void __init pmd_advanced_tests(struct mm_struct *mm,
|
static void __init pmd_advanced_tests(struct mm_struct *mm,
|
||||||
struct vm_area_struct *vma, pmd_t *pmdp,
|
struct vm_area_struct *vma, pmd_t *pmdp,
|
||||||
unsigned long pfn, unsigned long vaddr,
|
unsigned long pfn, unsigned long vaddr,
|
||||||
@ -476,7 +476,7 @@ static void __init pmd_huge_tests(pmd_t *pmdp, unsigned long pfn, pgprot_t prot)
|
|||||||
static void __init pud_huge_tests(pud_t *pudp, unsigned long pfn, pgprot_t prot) { }
|
static void __init pud_huge_tests(pud_t *pudp, unsigned long pfn, pgprot_t prot) { }
|
||||||
#endif /* CONFIG_HAVE_ARCH_HUGE_VMAP */
|
#endif /* CONFIG_HAVE_ARCH_HUGE_VMAP */
|
||||||
|
|
||||||
static void __init p4d_basic_tests(unsigned long pfn, pgprot_t prot)
|
static void __init p4d_basic_tests(struct pgtable_debug_args *args)
|
||||||
{
|
{
|
||||||
p4d_t p4d;
|
p4d_t p4d;
|
||||||
|
|
||||||
@ -485,7 +485,7 @@ static void __init p4d_basic_tests(unsigned long pfn, pgprot_t prot)
|
|||||||
WARN_ON(!p4d_same(p4d, p4d));
|
WARN_ON(!p4d_same(p4d, p4d));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init pgd_basic_tests(unsigned long pfn, pgprot_t prot)
|
static void __init pgd_basic_tests(struct pgtable_debug_args *args)
|
||||||
{
|
{
|
||||||
pgd_t pgd;
|
pgd_t pgd;
|
||||||
|
|
||||||
@ -890,7 +890,7 @@ static void __init swap_migration_tests(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_HUGETLB_PAGE
|
#ifdef CONFIG_HUGETLB_PAGE
|
||||||
static void __init hugetlb_basic_tests(unsigned long pfn, pgprot_t prot)
|
static void __init hugetlb_basic_tests(struct pgtable_debug_args *args)
|
||||||
{
|
{
|
||||||
struct page *page;
|
struct page *page;
|
||||||
pte_t pte;
|
pte_t pte;
|
||||||
@ -900,21 +900,21 @@ static void __init hugetlb_basic_tests(unsigned long pfn, pgprot_t prot)
|
|||||||
* Accessing the page associated with the pfn is safe here,
|
* Accessing the page associated with the pfn is safe here,
|
||||||
* as it was previously derived from a real kernel symbol.
|
* as it was previously derived from a real kernel symbol.
|
||||||
*/
|
*/
|
||||||
page = pfn_to_page(pfn);
|
page = pfn_to_page(args->fixed_pmd_pfn);
|
||||||
pte = mk_huge_pte(page, prot);
|
pte = mk_huge_pte(page, args->page_prot);
|
||||||
|
|
||||||
WARN_ON(!huge_pte_dirty(huge_pte_mkdirty(pte)));
|
WARN_ON(!huge_pte_dirty(huge_pte_mkdirty(pte)));
|
||||||
WARN_ON(!huge_pte_write(huge_pte_mkwrite(huge_pte_wrprotect(pte))));
|
WARN_ON(!huge_pte_write(huge_pte_mkwrite(huge_pte_wrprotect(pte))));
|
||||||
WARN_ON(huge_pte_write(huge_pte_wrprotect(huge_pte_mkwrite(pte))));
|
WARN_ON(huge_pte_write(huge_pte_wrprotect(huge_pte_mkwrite(pte))));
|
||||||
|
|
||||||
#ifdef CONFIG_ARCH_WANT_GENERAL_HUGETLB
|
#ifdef CONFIG_ARCH_WANT_GENERAL_HUGETLB
|
||||||
pte = pfn_pte(pfn, prot);
|
pte = pfn_pte(args->fixed_pmd_pfn, args->page_prot);
|
||||||
|
|
||||||
WARN_ON(!pte_huge(pte_mkhuge(pte)));
|
WARN_ON(!pte_huge(pte_mkhuge(pte)));
|
||||||
#endif /* CONFIG_ARCH_WANT_GENERAL_HUGETLB */
|
#endif /* CONFIG_ARCH_WANT_GENERAL_HUGETLB */
|
||||||
}
|
}
|
||||||
#else /* !CONFIG_HUGETLB_PAGE */
|
#else /* !CONFIG_HUGETLB_PAGE */
|
||||||
static void __init hugetlb_basic_tests(unsigned long pfn, pgprot_t prot) { }
|
static void __init hugetlb_basic_tests(struct pgtable_debug_args *args) { }
|
||||||
#endif /* CONFIG_HUGETLB_PAGE */
|
#endif /* CONFIG_HUGETLB_PAGE */
|
||||||
|
|
||||||
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
|
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
|
||||||
@ -1230,7 +1230,7 @@ static int __init debug_vm_pgtable(void)
|
|||||||
pgprot_t prot, protnone;
|
pgprot_t prot, protnone;
|
||||||
phys_addr_t paddr;
|
phys_addr_t paddr;
|
||||||
unsigned long vaddr, pte_aligned, pmd_aligned;
|
unsigned long vaddr, pte_aligned, pmd_aligned;
|
||||||
unsigned long pud_aligned, p4d_aligned, pgd_aligned;
|
unsigned long pud_aligned;
|
||||||
spinlock_t *ptl = NULL;
|
spinlock_t *ptl = NULL;
|
||||||
int idx, ret;
|
int idx, ret;
|
||||||
|
|
||||||
@ -1273,8 +1273,6 @@ static int __init debug_vm_pgtable(void)
|
|||||||
pte_aligned = (paddr & PAGE_MASK) >> PAGE_SHIFT;
|
pte_aligned = (paddr & PAGE_MASK) >> PAGE_SHIFT;
|
||||||
pmd_aligned = (paddr & PMD_MASK) >> PAGE_SHIFT;
|
pmd_aligned = (paddr & PMD_MASK) >> PAGE_SHIFT;
|
||||||
pud_aligned = (paddr & PUD_MASK) >> PAGE_SHIFT;
|
pud_aligned = (paddr & PUD_MASK) >> PAGE_SHIFT;
|
||||||
p4d_aligned = (paddr & P4D_MASK) >> PAGE_SHIFT;
|
|
||||||
pgd_aligned = (paddr & PGDIR_MASK) >> PAGE_SHIFT;
|
|
||||||
WARN_ON(!pfn_valid(pte_aligned));
|
WARN_ON(!pfn_valid(pte_aligned));
|
||||||
|
|
||||||
pgdp = pgd_offset(mm, vaddr);
|
pgdp = pgd_offset(mm, vaddr);
|
||||||
@ -1308,9 +1306,9 @@ static int __init debug_vm_pgtable(void)
|
|||||||
* given page table entry.
|
* given page table entry.
|
||||||
*/
|
*/
|
||||||
for (idx = 0; idx < ARRAY_SIZE(protection_map); idx++) {
|
for (idx = 0; idx < ARRAY_SIZE(protection_map); idx++) {
|
||||||
pte_basic_tests(pte_aligned, idx);
|
pte_basic_tests(&args, idx);
|
||||||
pmd_basic_tests(pmd_aligned, idx);
|
pmd_basic_tests(&args, idx);
|
||||||
pud_basic_tests(mm, pud_aligned, idx);
|
pud_basic_tests(&args, idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1320,8 +1318,8 @@ static int __init debug_vm_pgtable(void)
|
|||||||
* the above iteration for now to save some test execution
|
* the above iteration for now to save some test execution
|
||||||
* time.
|
* time.
|
||||||
*/
|
*/
|
||||||
p4d_basic_tests(p4d_aligned, prot);
|
p4d_basic_tests(&args);
|
||||||
pgd_basic_tests(pgd_aligned, prot);
|
pgd_basic_tests(&args);
|
||||||
|
|
||||||
pmd_leaf_tests(pmd_aligned, prot);
|
pmd_leaf_tests(pmd_aligned, prot);
|
||||||
pud_leaf_tests(pud_aligned, prot);
|
pud_leaf_tests(pud_aligned, prot);
|
||||||
@ -1350,7 +1348,7 @@ static int __init debug_vm_pgtable(void)
|
|||||||
pmd_thp_tests(pmd_aligned, prot);
|
pmd_thp_tests(pmd_aligned, prot);
|
||||||
pud_thp_tests(pud_aligned, prot);
|
pud_thp_tests(pud_aligned, prot);
|
||||||
|
|
||||||
hugetlb_basic_tests(pte_aligned, prot);
|
hugetlb_basic_tests(&args);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Page table modifying tests. They need to hold
|
* Page table modifying tests. They need to hold
|
||||||
|
Loading…
Reference in New Issue
Block a user