Re: [PATCH v3 07/22] checkpatch: Warn on page table access without accessors

From: David Hildenbrand (Red Hat)

Date: Thu Nov 13 2025 - 14:17:29 EST


On 13.11.25 03:36, Samuel Holland wrote:
On 2025-11-12 8:21 PM, Joe Perches wrote:
On Wed, 2025-11-12 at 17:45 -0800, Samuel Holland wrote:
Architectures may have special rules for accessing the hardware page
tables (for example, atomicity/ordering requirements), so the generic MM
code provides the pXXp_get() and set_pXX() hooks for architectures to
implement. These accessor functions are often omitted where a raw
pointer dereference is believed to be safe (i.e. race-free). However,
RISC-V needs to use these hooks to rewrite the page table values at
read/write time on some platforms. A raw pointer dereference will no
longer produce the correct value on those platforms, so the generic code
must always use the accessor functions.
[]
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
[]
@@ -7721,6 +7721,13 @@ sub process {
ERROR("MISSING_SENTINEL", "missing sentinel in ID array\n" . "$here\n$stat\n");
}
}
+
+# check for raw dereferences of hardware page table pointers
+ if ($realfile !~ m@^arch/@ &&
+ $line =~ /(?<!pte_t |p[mu4g]d_t |izeof\()\*\(?(vmf(\.|->))?(pte|p[mu4g]d)p?\b/) {
+ WARN("PAGE_TABLE_ACCESSORS",
+ "Use $3p_get()/set_$3() instead of dereferencing page table pointers\n" . $herecurr);
+ }
}

Seems like a lot of matches

$ git grep -P '(?<!pte_t |p[mu4g]d_t |izeof\()\*\(?(vmf(\.|->))?(pte|p[mu4g]d)p?\b' | \
grep -v '^arch/' | wc -l
766

That is indeed concerning.

I recall that we discussed an alternative approach with Ryan in the past: I don't remember all the details, but essentially it was about using separate types, such that dereferencing would not get you the type the other functions would be expecting. Such that the compiler will bark when you try to dereference.


--
Cheers

David