]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
perf/events: Replace READ_ONCE() with standard pgtable accessors
authorAnshuman Khandual <anshuman.khandual@arm.com>
Fri, 27 Feb 2026 06:27:44 +0000 (06:27 +0000)
committerPeter Zijlstra <peterz@infradead.org>
Wed, 8 Apr 2026 11:11:46 +0000 (13:11 +0200)
Replace raw READ_ONCE() dereferences of pgtable entries with corresponding
standard page table accessors pxdp_get() in perf_get_pgtable_size(). These
accessors default to READ_ONCE() on platforms that don't override them. So
there is no functional change on such platforms.

However arm64 platform is being extended to support 128 bit page tables via
a new architecture feature i.e FEAT_D128 in which case READ_ONCE() will not
provide required single copy atomic access for 128 bit page table entries.
Although pxdp_get() accessors can later be overridden on arm64 platform to
extend required single copy atomicity support on 128 bit entries.

Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://patch.msgid.link/20260227062744.2215491-1-anshuman.khandual@arm.com
kernel/events/core.c

index 5eeae8636996cc8c4c32dd18d51da908a3594c11..95d7a3e57268b6b49749babd7e798dd98d9d489e 100644 (file)
@@ -8421,7 +8421,7 @@ static u64 perf_get_pgtable_size(struct mm_struct *mm, unsigned long addr)
        pte_t *ptep, pte;
 
        pgdp = pgd_offset(mm, addr);
-       pgd = READ_ONCE(*pgdp);
+       pgd = pgdp_get(pgdp);
        if (pgd_none(pgd))
                return 0;
 
@@ -8429,7 +8429,7 @@ static u64 perf_get_pgtable_size(struct mm_struct *mm, unsigned long addr)
                return pgd_leaf_size(pgd);
 
        p4dp = p4d_offset_lockless(pgdp, pgd, addr);
-       p4d = READ_ONCE(*p4dp);
+       p4d = p4dp_get(p4dp);
        if (!p4d_present(p4d))
                return 0;
 
@@ -8437,7 +8437,7 @@ static u64 perf_get_pgtable_size(struct mm_struct *mm, unsigned long addr)
                return p4d_leaf_size(p4d);
 
        pudp = pud_offset_lockless(p4dp, p4d, addr);
-       pud = READ_ONCE(*pudp);
+       pud = pudp_get(pudp);
        if (!pud_present(pud))
                return 0;