Commit a0c9fd22 authored by Anshuman Khandual's avatar Anshuman Khandual Committed by Andrew Morton

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.comSigned-off-by: default avatarAnshuman Khandual <anshuman.khandual@arm.com>
Acked-by: default avatarDavid Hildenbrand <david@redhat.com>
Cc: Ryan Roberts <ryan.roberts@arm.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent 82ce8e2f
...@@ -231,10 +231,10 @@ static void __init pmd_advanced_tests(struct pgtable_debug_args *args) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) { } ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment