* [PATCH] ARM: integrator: Fix early initialization
@ 2025-05-18 16:41 Guenter Roeck
2025-05-18 17:47 ` Russell King (Oracle)
0 siblings, 1 reply; 3+ messages in thread
From: Guenter Roeck @ 2025-05-18 16:41 UTC (permalink / raw)
To: Linus Walleij
Cc: Liviu Dudau, Sudeep Holla, Lorenzo Pieralisi, Russell King,
linux-arm-kernel, linux-kernel, Guenter Roeck
Starting with commit bdb249fce9ad4 ("ARM: integrator: read counter using
syscon/regmap"), intcp_init_early calls syscon_regmap_lookup_by_compatible
which in turn calls of_syscon_register. This function allocates memory.
Since the memory management code has not been initialized at that time,
the call always fails. It either returns -ENOMEM or crashes as follows.
Unable to handle kernel NULL pointer dereference at virtual address 0000000c when read
[0000000c] *pgd=00000000
Internal error: Oops: 5 [#1] ARM
Modules linked in:
CPU: 0 UID: 0 PID: 0 Comm: swapper Not tainted 6.15.0-rc5-00026-g5fcc9bf84ee5 #1 PREEMPT
Hardware name: ARM Integrator/CP (Device Tree)
PC is at __kmalloc_cache_noprof+0xec/0x39c
LR is at __kmalloc_cache_noprof+0x34/0x39c
...
Call trace:
__kmalloc_cache_noprof from of_syscon_register+0x7c/0x310
of_syscon_register from device_node_get_regmap+0xa4/0xb0
device_node_get_regmap from intcp_init_early+0xc/0x40
intcp_init_early from start_kernel+0x60/0x688
start_kernel from 0x0
The crash is seen due to a dereferenced pointer which is not supposed to be
NULL but is NULL if the memory management subsystem has not been
initialized. The crash is not seen with all versions of gcc. Some versions
such as gcc 9.x apparently do not dereference the pointer, presumably if
tracing is disabled. The problem has been reproduced with gcc 10.x, 11.x,
and 13.x. Either case, if the crash is not seen, the call to
syscon_regmap_lookup_by_compatible returns -ENOMEM, and
sched_clock_register is never called.
Fix the problem by moving the early initialization code into the standard
machine initialization code.
Fixes: bdb249fce9ad4 ("ARM: integrator: read counter using syscon/regmap")
Cc: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
arch/arm/mach-versatile/integrator_cp.c | 13 ++++---------
1 file changed, 4 insertions(+), 9 deletions(-)
diff --git a/arch/arm/mach-versatile/integrator_cp.c b/arch/arm/mach-versatile/integrator_cp.c
index 2ed4ded56b3f..03dfb5f720b7 100644
--- a/arch/arm/mach-versatile/integrator_cp.c
+++ b/arch/arm/mach-versatile/integrator_cp.c
@@ -86,14 +86,6 @@ static u64 notrace intcp_read_sched_clock(void)
return val;
}
-static void __init intcp_init_early(void)
-{
- cm_map = syscon_regmap_lookup_by_compatible("arm,core-module-integrator");
- if (IS_ERR(cm_map))
- return;
- sched_clock_register(intcp_read_sched_clock, 32, 24000000);
-}
-
static void __init intcp_init_irq_of(void)
{
cm_init();
@@ -119,6 +111,10 @@ static void __init intcp_init_of(void)
{
struct device_node *cpcon;
+ cm_map = syscon_regmap_lookup_by_compatible("arm,core-module-integrator");
+ if (!IS_ERR(cm_map))
+ sched_clock_register(intcp_read_sched_clock, 32, 24000000);
+
cpcon = of_find_matching_node(NULL, intcp_syscon_match);
if (!cpcon)
return;
@@ -138,7 +134,6 @@ static const char * intcp_dt_board_compat[] = {
DT_MACHINE_START(INTEGRATOR_CP_DT, "ARM Integrator/CP (Device Tree)")
.reserve = integrator_reserve,
.map_io = intcp_map_io,
- .init_early = intcp_init_early,
.init_irq = intcp_init_irq_of,
.init_machine = intcp_init_of,
.dt_compat = intcp_dt_board_compat,
--
2.45.2
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] ARM: integrator: Fix early initialization
2025-05-18 16:41 [PATCH] ARM: integrator: Fix early initialization Guenter Roeck
@ 2025-05-18 17:47 ` Russell King (Oracle)
2025-05-18 19:09 ` Guenter Roeck
0 siblings, 1 reply; 3+ messages in thread
From: Russell King (Oracle) @ 2025-05-18 17:47 UTC (permalink / raw)
To: Guenter Roeck
Cc: Linus Walleij, Liviu Dudau, Sudeep Holla, Lorenzo Pieralisi,
linux-arm-kernel, linux-kernel
On Sun, May 18, 2025 at 09:41:18AM -0700, Guenter Roeck wrote:
> Starting with commit bdb249fce9ad4 ("ARM: integrator: read counter using
> syscon/regmap"), intcp_init_early calls syscon_regmap_lookup_by_compatible
> which in turn calls of_syscon_register. This function allocates memory.
> Since the memory management code has not been initialized at that time,
> the call always fails. It either returns -ENOMEM or crashes as follows.
Yet I see no thought whether having the scheduler see sched_clock()
suddenly change is a good idea or not. The point of the initialisation
being early is to avoid a jump in the scheduler clock.
So, was the commit you're trying to fix a good idea after all?
That question at least needs to be considered, rather than just moving
stuff like this later.
--
RMK's Patch system: https://www.armlinux.org.uk/developer/patches/
FTTP is here! 80Mbps down 10Mbps up. Decent connectivity at last!
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] ARM: integrator: Fix early initialization
2025-05-18 17:47 ` Russell King (Oracle)
@ 2025-05-18 19:09 ` Guenter Roeck
0 siblings, 0 replies; 3+ messages in thread
From: Guenter Roeck @ 2025-05-18 19:09 UTC (permalink / raw)
To: Russell King (Oracle)
Cc: Linus Walleij, Liviu Dudau, Sudeep Holla, Lorenzo Pieralisi,
linux-arm-kernel, linux-kernel
On 5/18/25 10:47, Russell King (Oracle) wrote:
> On Sun, May 18, 2025 at 09:41:18AM -0700, Guenter Roeck wrote:
>> Starting with commit bdb249fce9ad4 ("ARM: integrator: read counter using
>> syscon/regmap"), intcp_init_early calls syscon_regmap_lookup_by_compatible
>> which in turn calls of_syscon_register. This function allocates memory.
>> Since the memory management code has not been initialized at that time,
>> the call always fails. It either returns -ENOMEM or crashes as follows.
>
> Yet I see no thought whether having the scheduler see sched_clock()
> suddenly change is a good idea or not. The point of the initialisation
> being early is to avoid a jump in the scheduler clock.
>
> So, was the commit you're trying to fix a good idea after all?
>
> That question at least needs to be considered, rather than just moving
> stuff like this later.
>
Absolutely. Just consider this to be a bug report with a proposed fix.
Thanks,
Guenter
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2025-05-18 19:09 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-05-18 16:41 [PATCH] ARM: integrator: Fix early initialization Guenter Roeck
2025-05-18 17:47 ` Russell King (Oracle)
2025-05-18 19:09 ` Guenter Roeck
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®