• Brandon Maier's avatar
    remoteproc: Initialize rproc_class before use · 7ac919b5
    Brandon Maier authored
    BugLink: https://bugs.launchpad.net/bugs/1868627
    
    [ Upstream commit a8f40111 ]
    
    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: default avatarBrandon Maier <brandon.maier@rockwellcollins.com>
    Link: https://lore.kernel.org/r/20190530225223.136420-1-brandon.maier@rockwellcollins.comSigned-off-by: default avatarBjorn Andersson <bjorn.andersson@linaro.org>
    Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
    Signed-off-by: default avatarKhalid Elmously <khalid.elmously@canonical.com>
    Signed-off-by: default avatarKelsey Skunberg <kelsey.skunberg@canonical.com>
    7ac919b5
remoteproc_core.c 40.6 KB