mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2024-12-29 01:03:32 +00:00
mm/debug_vm_pgtable: Use pxdp_get() for accessing page table entries
This replaces all the existing READ_ONCE() based page table accesses with respective pxdp_get() helpers. Although these helpers might also fallback to READ_ONCE() as default, but they do provide an opportunity for various platforms to override when required. This change is a step in direction to replace all page table entry accesses with respective pxdp_get() helpers. Link: https://lkml.kernel.org/r/20240910115746.514454-1-anshuman.khandual@arm.com Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com> Acked-by: David Hildenbrand <david@redhat.com> Cc: Ryan Roberts <ryan.roberts@arm.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
82ce8e2f31
commit
a0c9fd22e3
@ -231,10 +231,10 @@ static void __init pmd_advanced_tests(struct pgtable_debug_args *args)
|
|||||||
set_pmd_at(args->mm, vaddr, args->pmdp, pmd);
|
set_pmd_at(args->mm, vaddr, args->pmdp, pmd);
|
||||||
flush_dcache_page(page);
|
flush_dcache_page(page);
|
||||||
pmdp_set_wrprotect(args->mm, vaddr, args->pmdp);
|
pmdp_set_wrprotect(args->mm, vaddr, args->pmdp);
|
||||||
pmd = READ_ONCE(*args->pmdp);
|
pmd = pmdp_get(args->pmdp);
|
||||||
WARN_ON(pmd_write(pmd));
|
WARN_ON(pmd_write(pmd));
|
||||||
pmdp_huge_get_and_clear(args->mm, vaddr, args->pmdp);
|
pmdp_huge_get_and_clear(args->mm, vaddr, args->pmdp);
|
||||||
pmd = READ_ONCE(*args->pmdp);
|
pmd = pmdp_get(args->pmdp);
|
||||||
WARN_ON(!pmd_none(pmd));
|
WARN_ON(!pmd_none(pmd));
|
||||||
|
|
||||||
pmd = pfn_pmd(args->pmd_pfn, args->page_prot);
|
pmd = pfn_pmd(args->pmd_pfn, args->page_prot);
|
||||||
@ -245,10 +245,10 @@ static void __init pmd_advanced_tests(struct pgtable_debug_args *args)
|
|||||||
pmd = pmd_mkwrite(pmd, args->vma);
|
pmd = pmd_mkwrite(pmd, args->vma);
|
||||||
pmd = pmd_mkdirty(pmd);
|
pmd = pmd_mkdirty(pmd);
|
||||||
pmdp_set_access_flags(args->vma, vaddr, args->pmdp, pmd, 1);
|
pmdp_set_access_flags(args->vma, vaddr, args->pmdp, pmd, 1);
|
||||||
pmd = READ_ONCE(*args->pmdp);
|
pmd = pmdp_get(args->pmdp);
|
||||||
WARN_ON(!(pmd_write(pmd) && pmd_dirty(pmd)));
|
WARN_ON(!(pmd_write(pmd) && pmd_dirty(pmd)));
|
||||||
pmdp_huge_get_and_clear_full(args->vma, vaddr, args->pmdp, 1);
|
pmdp_huge_get_and_clear_full(args->vma, vaddr, args->pmdp, 1);
|
||||||
pmd = READ_ONCE(*args->pmdp);
|
pmd = pmdp_get(args->pmdp);
|
||||||
WARN_ON(!pmd_none(pmd));
|
WARN_ON(!pmd_none(pmd));
|
||||||
|
|
||||||
pmd = pmd_mkhuge(pfn_pmd(args->pmd_pfn, args->page_prot));
|
pmd = pmd_mkhuge(pfn_pmd(args->pmd_pfn, args->page_prot));
|
||||||
@ -256,7 +256,7 @@ static void __init pmd_advanced_tests(struct pgtable_debug_args *args)
|
|||||||
set_pmd_at(args->mm, vaddr, args->pmdp, pmd);
|
set_pmd_at(args->mm, vaddr, args->pmdp, pmd);
|
||||||
flush_dcache_page(page);
|
flush_dcache_page(page);
|
||||||
pmdp_test_and_clear_young(args->vma, vaddr, args->pmdp);
|
pmdp_test_and_clear_young(args->vma, vaddr, args->pmdp);
|
||||||
pmd = READ_ONCE(*args->pmdp);
|
pmd = pmdp_get(args->pmdp);
|
||||||
WARN_ON(pmd_young(pmd));
|
WARN_ON(pmd_young(pmd));
|
||||||
|
|
||||||
/* Clear the pte entries */
|
/* Clear the pte entries */
|
||||||
@ -357,12 +357,12 @@ static void __init pud_advanced_tests(struct pgtable_debug_args *args)
|
|||||||
set_pud_at(args->mm, vaddr, args->pudp, pud);
|
set_pud_at(args->mm, vaddr, args->pudp, pud);
|
||||||
flush_dcache_page(page);
|
flush_dcache_page(page);
|
||||||
pudp_set_wrprotect(args->mm, vaddr, args->pudp);
|
pudp_set_wrprotect(args->mm, vaddr, args->pudp);
|
||||||
pud = READ_ONCE(*args->pudp);
|
pud = pudp_get(args->pudp);
|
||||||
WARN_ON(pud_write(pud));
|
WARN_ON(pud_write(pud));
|
||||||
|
|
||||||
#ifndef __PAGETABLE_PMD_FOLDED
|
#ifndef __PAGETABLE_PMD_FOLDED
|
||||||
pudp_huge_get_and_clear(args->mm, vaddr, args->pudp);
|
pudp_huge_get_and_clear(args->mm, vaddr, args->pudp);
|
||||||
pud = READ_ONCE(*args->pudp);
|
pud = pudp_get(args->pudp);
|
||||||
WARN_ON(!pud_none(pud));
|
WARN_ON(!pud_none(pud));
|
||||||
#endif /* __PAGETABLE_PMD_FOLDED */
|
#endif /* __PAGETABLE_PMD_FOLDED */
|
||||||
pud = pfn_pud(args->pud_pfn, args->page_prot);
|
pud = pfn_pud(args->pud_pfn, args->page_prot);
|
||||||
@ -374,12 +374,12 @@ static void __init pud_advanced_tests(struct pgtable_debug_args *args)
|
|||||||
pud = pud_mkwrite(pud);
|
pud = pud_mkwrite(pud);
|
||||||
pud = pud_mkdirty(pud);
|
pud = pud_mkdirty(pud);
|
||||||
pudp_set_access_flags(args->vma, vaddr, args->pudp, pud, 1);
|
pudp_set_access_flags(args->vma, vaddr, args->pudp, pud, 1);
|
||||||
pud = READ_ONCE(*args->pudp);
|
pud = pudp_get(args->pudp);
|
||||||
WARN_ON(!(pud_write(pud) && pud_dirty(pud)));
|
WARN_ON(!(pud_write(pud) && pud_dirty(pud)));
|
||||||
|
|
||||||
#ifndef __PAGETABLE_PMD_FOLDED
|
#ifndef __PAGETABLE_PMD_FOLDED
|
||||||
pudp_huge_get_and_clear_full(args->vma, vaddr, args->pudp, 1);
|
pudp_huge_get_and_clear_full(args->vma, vaddr, args->pudp, 1);
|
||||||
pud = READ_ONCE(*args->pudp);
|
pud = pudp_get(args->pudp);
|
||||||
WARN_ON(!pud_none(pud));
|
WARN_ON(!pud_none(pud));
|
||||||
#endif /* __PAGETABLE_PMD_FOLDED */
|
#endif /* __PAGETABLE_PMD_FOLDED */
|
||||||
|
|
||||||
@ -389,7 +389,7 @@ static void __init pud_advanced_tests(struct pgtable_debug_args *args)
|
|||||||
set_pud_at(args->mm, vaddr, args->pudp, pud);
|
set_pud_at(args->mm, vaddr, args->pudp, pud);
|
||||||
flush_dcache_page(page);
|
flush_dcache_page(page);
|
||||||
pudp_test_and_clear_young(args->vma, vaddr, args->pudp);
|
pudp_test_and_clear_young(args->vma, vaddr, args->pudp);
|
||||||
pud = READ_ONCE(*args->pudp);
|
pud = pudp_get(args->pudp);
|
||||||
WARN_ON(pud_young(pud));
|
WARN_ON(pud_young(pud));
|
||||||
|
|
||||||
pudp_huge_get_and_clear(args->mm, vaddr, args->pudp);
|
pudp_huge_get_and_clear(args->mm, vaddr, args->pudp);
|
||||||
@ -441,7 +441,7 @@ static void __init pmd_huge_tests(struct pgtable_debug_args *args)
|
|||||||
WRITE_ONCE(*args->pmdp, __pmd(0));
|
WRITE_ONCE(*args->pmdp, __pmd(0));
|
||||||
WARN_ON(!pmd_set_huge(args->pmdp, __pfn_to_phys(args->fixed_pmd_pfn), args->page_prot));
|
WARN_ON(!pmd_set_huge(args->pmdp, __pfn_to_phys(args->fixed_pmd_pfn), args->page_prot));
|
||||||
WARN_ON(!pmd_clear_huge(args->pmdp));
|
WARN_ON(!pmd_clear_huge(args->pmdp));
|
||||||
pmd = READ_ONCE(*args->pmdp);
|
pmd = pmdp_get(args->pmdp);
|
||||||
WARN_ON(!pmd_none(pmd));
|
WARN_ON(!pmd_none(pmd));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -461,7 +461,7 @@ static void __init pud_huge_tests(struct pgtable_debug_args *args)
|
|||||||
WRITE_ONCE(*args->pudp, __pud(0));
|
WRITE_ONCE(*args->pudp, __pud(0));
|
||||||
WARN_ON(!pud_set_huge(args->pudp, __pfn_to_phys(args->fixed_pud_pfn), args->page_prot));
|
WARN_ON(!pud_set_huge(args->pudp, __pfn_to_phys(args->fixed_pud_pfn), args->page_prot));
|
||||||
WARN_ON(!pud_clear_huge(args->pudp));
|
WARN_ON(!pud_clear_huge(args->pudp));
|
||||||
pud = READ_ONCE(*args->pudp);
|
pud = pudp_get(args->pudp);
|
||||||
WARN_ON(!pud_none(pud));
|
WARN_ON(!pud_none(pud));
|
||||||
}
|
}
|
||||||
#else /* !CONFIG_HAVE_ARCH_HUGE_VMAP */
|
#else /* !CONFIG_HAVE_ARCH_HUGE_VMAP */
|
||||||
@ -490,7 +490,7 @@ static void __init pgd_basic_tests(struct pgtable_debug_args *args)
|
|||||||
#ifndef __PAGETABLE_PUD_FOLDED
|
#ifndef __PAGETABLE_PUD_FOLDED
|
||||||
static void __init pud_clear_tests(struct pgtable_debug_args *args)
|
static void __init pud_clear_tests(struct pgtable_debug_args *args)
|
||||||
{
|
{
|
||||||
pud_t pud = READ_ONCE(*args->pudp);
|
pud_t pud = pudp_get(args->pudp);
|
||||||
|
|
||||||
if (mm_pmd_folded(args->mm))
|
if (mm_pmd_folded(args->mm))
|
||||||
return;
|
return;
|
||||||
@ -498,7 +498,7 @@ static void __init pud_clear_tests(struct pgtable_debug_args *args)
|
|||||||
pr_debug("Validating PUD clear\n");
|
pr_debug("Validating PUD clear\n");
|
||||||
WARN_ON(pud_none(pud));
|
WARN_ON(pud_none(pud));
|
||||||
pud_clear(args->pudp);
|
pud_clear(args->pudp);
|
||||||
pud = READ_ONCE(*args->pudp);
|
pud = pudp_get(args->pudp);
|
||||||
WARN_ON(!pud_none(pud));
|
WARN_ON(!pud_none(pud));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -515,7 +515,7 @@ static void __init pud_populate_tests(struct pgtable_debug_args *args)
|
|||||||
* Hence this must not qualify as pud_bad().
|
* Hence this must not qualify as pud_bad().
|
||||||
*/
|
*/
|
||||||
pud_populate(args->mm, args->pudp, args->start_pmdp);
|
pud_populate(args->mm, args->pudp, args->start_pmdp);
|
||||||
pud = READ_ONCE(*args->pudp);
|
pud = pudp_get(args->pudp);
|
||||||
WARN_ON(pud_bad(pud));
|
WARN_ON(pud_bad(pud));
|
||||||
}
|
}
|
||||||
#else /* !__PAGETABLE_PUD_FOLDED */
|
#else /* !__PAGETABLE_PUD_FOLDED */
|
||||||
@ -526,7 +526,7 @@ static void __init pud_populate_tests(struct pgtable_debug_args *args) { }
|
|||||||
#ifndef __PAGETABLE_P4D_FOLDED
|
#ifndef __PAGETABLE_P4D_FOLDED
|
||||||
static void __init p4d_clear_tests(struct pgtable_debug_args *args)
|
static void __init p4d_clear_tests(struct pgtable_debug_args *args)
|
||||||
{
|
{
|
||||||
p4d_t p4d = READ_ONCE(*args->p4dp);
|
p4d_t p4d = p4dp_get(args->p4dp);
|
||||||
|
|
||||||
if (mm_pud_folded(args->mm))
|
if (mm_pud_folded(args->mm))
|
||||||
return;
|
return;
|
||||||
@ -534,7 +534,7 @@ static void __init p4d_clear_tests(struct pgtable_debug_args *args)
|
|||||||
pr_debug("Validating P4D clear\n");
|
pr_debug("Validating P4D clear\n");
|
||||||
WARN_ON(p4d_none(p4d));
|
WARN_ON(p4d_none(p4d));
|
||||||
p4d_clear(args->p4dp);
|
p4d_clear(args->p4dp);
|
||||||
p4d = READ_ONCE(*args->p4dp);
|
p4d = p4dp_get(args->p4dp);
|
||||||
WARN_ON(!p4d_none(p4d));
|
WARN_ON(!p4d_none(p4d));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -553,13 +553,13 @@ static void __init p4d_populate_tests(struct pgtable_debug_args *args)
|
|||||||
pud_clear(args->pudp);
|
pud_clear(args->pudp);
|
||||||
p4d_clear(args->p4dp);
|
p4d_clear(args->p4dp);
|
||||||
p4d_populate(args->mm, args->p4dp, args->start_pudp);
|
p4d_populate(args->mm, args->p4dp, args->start_pudp);
|
||||||
p4d = READ_ONCE(*args->p4dp);
|
p4d = p4dp_get(args->p4dp);
|
||||||
WARN_ON(p4d_bad(p4d));
|
WARN_ON(p4d_bad(p4d));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init pgd_clear_tests(struct pgtable_debug_args *args)
|
static void __init pgd_clear_tests(struct pgtable_debug_args *args)
|
||||||
{
|
{
|
||||||
pgd_t pgd = READ_ONCE(*(args->pgdp));
|
pgd_t pgd = pgdp_get(args->pgdp);
|
||||||
|
|
||||||
if (mm_p4d_folded(args->mm))
|
if (mm_p4d_folded(args->mm))
|
||||||
return;
|
return;
|
||||||
@ -567,7 +567,7 @@ static void __init pgd_clear_tests(struct pgtable_debug_args *args)
|
|||||||
pr_debug("Validating PGD clear\n");
|
pr_debug("Validating PGD clear\n");
|
||||||
WARN_ON(pgd_none(pgd));
|
WARN_ON(pgd_none(pgd));
|
||||||
pgd_clear(args->pgdp);
|
pgd_clear(args->pgdp);
|
||||||
pgd = READ_ONCE(*args->pgdp);
|
pgd = pgdp_get(args->pgdp);
|
||||||
WARN_ON(!pgd_none(pgd));
|
WARN_ON(!pgd_none(pgd));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -586,7 +586,7 @@ static void __init pgd_populate_tests(struct pgtable_debug_args *args)
|
|||||||
p4d_clear(args->p4dp);
|
p4d_clear(args->p4dp);
|
||||||
pgd_clear(args->pgdp);
|
pgd_clear(args->pgdp);
|
||||||
pgd_populate(args->mm, args->pgdp, args->start_p4dp);
|
pgd_populate(args->mm, args->pgdp, args->start_p4dp);
|
||||||
pgd = READ_ONCE(*args->pgdp);
|
pgd = pgdp_get(args->pgdp);
|
||||||
WARN_ON(pgd_bad(pgd));
|
WARN_ON(pgd_bad(pgd));
|
||||||
}
|
}
|
||||||
#else /* !__PAGETABLE_P4D_FOLDED */
|
#else /* !__PAGETABLE_P4D_FOLDED */
|
||||||
@ -627,12 +627,12 @@ static void __init pte_clear_tests(struct pgtable_debug_args *args)
|
|||||||
|
|
||||||
static void __init pmd_clear_tests(struct pgtable_debug_args *args)
|
static void __init pmd_clear_tests(struct pgtable_debug_args *args)
|
||||||
{
|
{
|
||||||
pmd_t pmd = READ_ONCE(*args->pmdp);
|
pmd_t pmd = pmdp_get(args->pmdp);
|
||||||
|
|
||||||
pr_debug("Validating PMD clear\n");
|
pr_debug("Validating PMD clear\n");
|
||||||
WARN_ON(pmd_none(pmd));
|
WARN_ON(pmd_none(pmd));
|
||||||
pmd_clear(args->pmdp);
|
pmd_clear(args->pmdp);
|
||||||
pmd = READ_ONCE(*args->pmdp);
|
pmd = pmdp_get(args->pmdp);
|
||||||
WARN_ON(!pmd_none(pmd));
|
WARN_ON(!pmd_none(pmd));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -646,7 +646,7 @@ static void __init pmd_populate_tests(struct pgtable_debug_args *args)
|
|||||||
* Hence this must not qualify as pmd_bad().
|
* Hence this must not qualify as pmd_bad().
|
||||||
*/
|
*/
|
||||||
pmd_populate(args->mm, args->pmdp, args->start_ptep);
|
pmd_populate(args->mm, args->pmdp, args->start_ptep);
|
||||||
pmd = READ_ONCE(*args->pmdp);
|
pmd = pmdp_get(args->pmdp);
|
||||||
WARN_ON(pmd_bad(pmd));
|
WARN_ON(pmd_bad(pmd));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1251,7 +1251,7 @@ static int __init init_args(struct pgtable_debug_args *args)
|
|||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
args->start_ptep = pmd_pgtable(READ_ONCE(*args->pmdp));
|
args->start_ptep = pmd_pgtable(pmdp_get(args->pmdp));
|
||||||
WARN_ON(!args->start_ptep);
|
WARN_ON(!args->start_ptep);
|
||||||
|
|
||||||
init_fixed_pfns(args);
|
init_fixed_pfns(args);
|
||||||
|
Loading…
Reference in New Issue
Block a user