On Thu, 2025-09-04 at 18:33 +0200, Christophe Leroy wrote: > PAGE_KERNEL_TEXT is an old macro that is used to tell kernel whether > kernel text has to be mapped read-only or read-write based on build > time options. > > But nowadays, with functionnalities like jump_labels, static links, > etc ... more only less all kernels need to be read-write at some > point, and some combinations of configs failed to work due to > innacurate setting of PAGE_KERNEL_TEXT. On the other hand, today > we have CONFIG_STRICT_KERNEL_RWX which implements a more controlled > access to kernel modifications. > > Instead of trying to keep PAGE_KERNEL_TEXT accurate with all > possible options that may imply kernel text modification, always > set kernel text read-write at startup and rely on > CONFIG_STRICT_KERNEL_RWX to provide accurate protection. > > Reported-by: Erhard Furtner <erhar...@mailbox.org> > Closes: > https://lore.kernel.org/all/342b4120-911c-4723-82ec-d8c9b03a8...@mailbox.org/ > Signed-off-by: Christophe Leroy <christophe.le...@csgroup.eu>
The original issue that Erhard and I were investigating was why the latest version of the PowerPC page table check series[0] was failing on his G4, when built as part of a config with many other debugging options enabled. With further instrumentation, it turns out that this was due to a failed instruction patch while setting up a jump label for the page_table_check_disabled static key, which was being checked in page_table_check_pte_clear(), which was in turn inlined ultimately into debug_vm_pgtable(). This patch seems to fix the problem, so: Tested-by: Andrew Donnellan <a...@linux.ibm.com> But I'm still curious about why I only see the issue when: (a) CONFIG_KFENCE=y (even when disabled using kfence.sample_interval=0) - noting that changing CONFIG_KFENCE doesn't change the definition of PAGE_KERNEL_TEXT; and (b) when the jump label ends up in a __init function (removing __init from debug_vm_pgtable() and its associated functions, or changing the code in such a way that the static key check doesn't get inlined, resolves the issue, and similarly for test_static_call_init() when CONFIG_STATIC_CALL_SELFTEST=y). I don't understand the mm code well enough to make sense of this. [0] https://lore.kernel.org/all/20250813062614.51759-1-...@linux.ibm.com/ -- Andrew Donnellan OzLabs, ADL Canberra a...@linux.ibm.com IBM Australia Limited