Re: [PATCH] powerpc/32: Remove PAGE_KERNEL_TEXT to fix startup failure
From: Andrew Donnellan <hidden>
Date: 2025-09-05 06:57:42
Also in:
lkml
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 <redacted> Closes: https://lore.kernel.org/all/342b4120-911c-4723-82ec-d8c9b03a8aef@mailbox.org/ (local) Signed-off-by: Christophe Leroy <redacted>
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 <redacted> 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-ajd@linux.ibm.com/ (local) -- Andrew Donnellan OzLabs, ADL Canberra ajd@linux.ibm.com IBM Australia Limited