Thread (174 messages) 174 messages, 5 authors, 2020-02-28
STALE2321d

[PATCH 4.9 090/165] remoteproc: Initialize rproc_class before use

From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date: 2020-02-27 13:50:38
Also in: lkml
Subsystem: remote processor (remoteproc) subsystem, the rest · Maintainers: Bjorn Andersson, Mathieu Poirier, Linus Torvalds

From: Brandon Maier <redacted>

[ Upstream commit a8f40111d184098cd2b3dc0c7170c42250a5fa09 ]

The remoteproc_core and remoteproc drivers all initialize with module_init().
However remoteproc drivers need the rproc_class during their probe. If one of
the remoteproc drivers runs init and gets through probe before
remoteproc_init() runs, a NULL pointer access of rproc_class's `glue_dirs`
spinlock occurs.
Unable to handle kernel NULL pointer dereference at virtual address 000000dc
pgd = c0004000
[000000dc] *pgd=00000000
Internal error: Oops: 5 [#1] PREEMPT ARM
Modules linked in:
CPU: 0 PID: 1 Comm: swapper Tainted: G        W       4.14.106-rt56 #1
Hardware name: Generic OMAP36xx (Flattened Device Tree)
task: c6050000 task.stack: c604a000
PC is at rt_spin_lock+0x40/0x6c
LR is at rt_spin_lock+0x28/0x6c
pc : [<c0523c90>]    lr : [<c0523c78>]    psr: 60000013
sp : c604bdc0  ip : 00000000  fp : 00000000
r10: 00000000  r9 : c61c7c10  r8 : c6269c20
r7 : c0905888  r6 : c6269c20  r5 : 00000000  r4 : 000000d4
r3 : 000000dc  r2 : c6050000  r1 : 00000002  r0 : 000000d4
Flags: nZCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment none
...
[<c0523c90>] (rt_spin_lock) from [<c03b65a4>] (get_device_parent+0x54/0x17c)
[<c03b65a4>] (get_device_parent) from [<c03b6bec>] (device_add+0xe0/0x5b4)
[<c03b6bec>] (device_add) from [<c042adf4>] (rproc_add+0x18/0xd8)
[<c042adf4>] (rproc_add) from [<c01110e4>] (my_rproc_probe+0x158/0x204)
[<c01110e4>] (my_rproc_probe) from [<c03bb6b8>] (platform_drv_probe+0x34/0x70)
[<c03bb6b8>] (platform_drv_probe) from [<c03b9dd4>] (driver_probe_device+0x2c8/0x420)
[<c03b9dd4>] (driver_probe_device) from [<c03ba02c>] (__driver_attach+0x100/0x11c)
[<c03ba02c>] (__driver_attach) from [<c03b7d08>] (bus_for_each_dev+0x7c/0xc0)
[<c03b7d08>] (bus_for_each_dev) from [<c03b910c>] (bus_add_driver+0x1cc/0x264)
[<c03b910c>] (bus_add_driver) from [<c03ba714>] (driver_register+0x78/0xf8)
[<c03ba714>] (driver_register) from [<c010181c>] (do_one_initcall+0x100/0x190)
[<c010181c>] (do_one_initcall) from [<c0800de8>] (kernel_init_freeable+0x130/0x1d0)
[<c0800de8>] (kernel_init_freeable) from [<c051eee8>] (kernel_init+0x8/0x114)
[<c051eee8>] (kernel_init) from [<c01175b0>] (ret_from_fork+0x14/0x24)
Code: e2843008 e3c2203f f5d3f000 e5922010 (e193cf9f)
---[ end trace 0000000000000002 ]---
Signed-off-by: Brandon Maier <redacted>
Link: https://lore.kernel.org/r/20190530225223.136420-1-brandon.maier@rockwellcollins.com (local)
Signed-off-by: Bjorn Andersson <redacted>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 drivers/remoteproc/remoteproc_core.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c
index c6bfb3496684e..b99780574044a 100644
--- a/drivers/remoteproc/remoteproc_core.c
+++ b/drivers/remoteproc/remoteproc_core.c
@@ -1488,7 +1488,7 @@ static int __init remoteproc_init(void)
 
 	return 0;
 }
-module_init(remoteproc_init);
+subsys_initcall(remoteproc_init);
 
 static void __exit remoteproc_exit(void)
 {
-- 
2.20.1


Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help