[PATCH 0/1] PCI/MSI: add NULL check before use of msi_desc

Hiraku Toyooka hiraku.toyooka at cybertrust.co.jp
Tue Jan 16 01:15:46 PST 2018


Hello,

I found a NULL pointer dereference in PCI/MSI when I tried to run kdump
kernel on i.MX6(MCIMX6Q-SDB). This error occurs when masking MSI irq
which does not have msi_desc.
I added NULL check to avoid the error, and kdump worked fine. But I'm
not sure this is correct way. What do you think about this fix?

My environment:
 - Board:  MCIMX6Q-SDB
 - Kernel: 4.15.0-rc5 (commit: 464e1d5f23)
   - used also as kdump kernel
   - CONFIG_CRASH_DUMP and CONFIG_DEBUG_INFO are enabled based on imx_v6_v7_defconfig
 - U-Boot: u-boot-fslc (2017.11+fslc branch)
   - built with meta-freescale (commit: bf7fd9cfe0)


Console log in failure case (patch not applied):

root at imx6qdlsabresd:~# cat /proc/cmdline
console=ttymxc0,115200 root=PARTUUID=6c7357c5-02 rootwait rw quiet crashkernel=96M
root at imx6qdlsabresd:~# kexec --type zImage -p /boot/zImage --dtb=/boot/imx6q-sabresd.dtb --append="console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw 3 maxcpus=1 reset_devices earlycon"
root at imx6qdlsabresd:~# echo c > /proc/sysrq-trigger
[   27.590895] sysrq: SysRq : Trigger a crash
[   27.595250] Unable to handle kernel NULL pointer dereference at virtual address 00000000
...(snip)...
[   27.808001] Backtrace:
[   27.810502] [<c04d1a58>] (sysrq_handle_crash) from [<c04d206c>] (__handle_sysrq+0xd8/0x258)
[   27.818877]  r5:00000063 r4:c101a6b0
[   27.822489] [<c04d1f94>] (__handle_sysrq) from [<c04d2688>] (write_sysrq_trigger+0x78/0x90)
[   27.830871]  r10:00000000 r9:00000002 r8:00000000 r7:e6490c00 r6:00000000 r5:01ced738
[   27.838719]  r4:00000002
[   27.841290] [<c04d2610>] (write_sysrq_trigger) from [<c02979bc>] (proc_reg_write+0x68/0x90)
[   27.849664]  r5:00000000 r4:c04d2610
[   27.853277] [<c0297954>] (proc_reg_write) from [<c022e50c>] (__vfs_write+0x34/0x134)
[   27.861050]  r9:00000002 r8:01ced738 r7:00000002 r6:e71a9f78 r5:c0297954 r4:e6a49cc0
[   27.868824] [<c022e4d8>] (__vfs_write) from [<c022e78c>] (vfs_write+0xa8/0x170)
[   27.876162]  r9:00000002 r8:01ced738 r7:e71a9f78 r6:01ced738 r5:e6a49cc0 r4:00000002
[   27.883936] [<c022e6e4>] (vfs_write) from [<c022e96c>] (SyS_write+0x44/0x98)
[   27.891014]  r9:00000002 r8:01ced738 r7:00000000 r6:00000000 r5:e6a49cc0 r4:e6a49cc0
[   27.898797] [<c022e928>] (SyS_write) from [<c0107fe0>] (ret_fast_syscall+0x0/0x28)
[   27.906395]  r9:e71a8000 r8:c01081a4 r7:00000004 r6:b6f7eda8 r5:01ced738 r4:00000002
[   27.914169] Code: e3a04000 e5835000 ee074f9a ebf11af2 (e5c45000)
[   27.920332] CPU 1 will stop doing anything useful since another CPU has crashed
[   27.920342] CPU 0 will stop doing anything useful since another CPU has crashed
[   27.920351] CPU 2 will stop doing anything useful since another CPU has crashed
[   27.949670] Unable to handle kernel NULL pointer dereference at virtual address 00000028
[   27.957798] pgd = c30fc51b
[   27.960529] [00000028] *pgd=4a140831
[   27.964144] Internal error: Oops: 17 [#2] SMP ARM
[   27.968869] Modules linked in:
[   27.971962] CPU: 3 PID: 399 Comm: sh Not tainted 4.15.0-rc5-g3630470 #15
[   27.978685] Hardware name: Freescale i.MX6 Quad/DualLite (Device Tree)
[   27.985248] PC is at msi_set_mask_bit+0x18/0x6c
[   27.989805] LR is at pci_msi_mask_irq+0x14/0x18
[   27.994358] pc : [<c0485ee4>]    lr : [<c0485f4c>]    psr: a0000193
[   28.000647] sp : e71a9bb0  ip : e71a9bc8  fp : e71a9bc4
[   28.005892] r10: ffffe000  r9 : e682e400  r8 : c101a72c
[   28.011140] r7 : e71a9c00  r6 : c102a504  r5 : 0000012f  r4 : 00000000
[   28.017690] r3 : e642b400  r2 : 00000001  r1 : 00000001  r0 : e642b414
[   28.024241] Flags: NzCv  IRQs off  FIQs on  Mode SVC_32  ISA ARM  Segment none
[   28.031486] Control: 10c5387d  Table: 36ef804a  DAC: 00000051
[   28.037255] Process sh (pid: 399, stack limit = 0x61f128fb)
[   28.042849] Stack: (0xe71a9bb0 to 0xe71aa000)
...(snip)...
[   28.334445] Backtrace:
[   28.336937] [<c0485ecc>] (msi_set_mask_bit) from [<c0485f4c>] (pci_msi_mask_irq+0x14/0x18)
[   28.345224]  r5:0000012f r4:e642b400
[   28.348844] [<c0485f38>] (pci_msi_mask_irq) from [<c0111308>] (machine_crash_shutdown+0xe8/0x1a0)
[   28.357763] [<c0111220>] (machine_crash_shutdown) from [<c01b4aa4>] (__crash_kexec+0x5c/0xa0)
[   28.366319]  r9:e682e400 r8:bf000000 r7:c100d9e4 r6:c17c9c88 r5:e71a9df0 r4:e71a9c00
[   28.374097] [<c01b4a48>] (__crash_kexec) from [<c01b4b58>] (crash_kexec+0x70/0x80)
[   28.381691]  r6:0000000b r5:ffffffff r4:c10155ac
[   28.386341] [<c01b4ae8>] (crash_kexec) from [<c010ce8c>] (die+0x230/0x368)
[   28.393239]  r5:e71a9df0 r4:c107b21c
[   28.396848] [<c010cc5c>] (die) from [<c0116b80>] (__do_kernel_fault.part.0+0x5c/0x7c)
[   28.404707]  r10:e69c96d4 r9:00000000 r8:00000817 r7:e69c9680 r6:00000817 r5:e71a9df0
[   28.412556]  r4:00000000
[   28.415123] [<c0116b24>] (__do_kernel_fault.part.0) from [<c01169a0>] (do_page_fault+0x3a4/0x3c4)
[   28.424017]  r7:e69c9680 r4:e71a9df0
[   28.427623] [<c01165fc>] (do_page_fault) from [<c0101388>] (do_DataAbort+0x3c/0xbc)
[   28.435310]  r10:00000000 r9:e71a8000 r8:e71a9df0 r7:00000000 r6:c01165fc r5:00000817
[   28.443159]  r4:c100e4a0
[   28.445723] [<c010134c>] (do_DataAbort) from [<c010d804>] (__dabt_svc+0x64/0xa0)
[   28.453140] Exception stack(0xe71a9df0 to 0xe71a9e38)
[   28.458217] 9de0:                                     00000000 00000730 00000000 00000000
[   28.466423] 9e00: 00000000 00000001 c10359a0 00000000 00000004 00000002 00000000 e71a9e54
[   28.474627] 9e20: e71a9e30 e71a9e40 c0118694 c04d1aa8 60000013 ffffffff
[   28.481268]  r8:00000004 r7:e71a9e24 r6:ffffffff r5:60000013 r4:c04d1aa8
[   28.488012] [<c04d1a58>] (sysrq_handle_crash) from [<c04d206c>] (__handle_sysrq+0xd8/0x258)
[   28.496385]  r5:00000063 r4:c101a6b0
[   28.499995] [<c04d1f94>] (__handle_sysrq) from [<c04d2688>] (write_sysrq_trigger+0x78/0x90)
[   28.508375]  r10:00000000 r9:00000002 r8:00000000 r7:e6490c00 r6:00000000 r5:01ced738
[   28.516223]  r4:00000002
[   28.518791] [<c04d2610>] (write_sysrq_trigger) from [<c02979bc>] (proc_reg_write+0x68/0x90)
[   28.527164]  r5:00000000 r4:c04d2610
[   28.530774] [<c0297954>] (proc_reg_write) from [<c022e50c>] (__vfs_write+0x34/0x134)
[   28.538547]  r9:00000002 r8:01ced738 r7:00000002 r6:e71a9f78 r5:c0297954 r4:e6a49cc0
[   28.546320] [<c022e4d8>] (__vfs_write) from [<c022e78c>] (vfs_write+0xa8/0x170)
[   28.553658]  r9:00000002 r8:01ced738 r7:e71a9f78 r6:01ced738 r5:e6a49cc0 r4:00000002
[   28.561433] [<c022e6e4>] (vfs_write) from [<c022e96c>] (SyS_write+0x44/0x98)
[   28.568511]  r9:00000002 r8:01ced738 r7:00000000 r6:00000000 r5:e6a49cc0 r4:e6a49cc0
[   28.576291] [<c022e928>] (SyS_write) from [<c0107fe0>] (ret_fast_syscall+0x0/0x28)
[   28.583890]  r9:e71a8000 r8:c01081a4 r7:00000004 r6:b6f7eda8 r5:01ced738 r4:00000002
[   28.591662] Code: e24cb004 e590300c e1a02001 e5934008 (e5d43028)
[   28.597788] ---[ end trace b7f10c526986d6ea ]---
[   28.602430] Kernel panic - not syncing: Fatal exception
[   28.607716] ---[ end Kernel panic - not syncing: Fatal exception


Console log in success case (patch applied):

root at imx6qdlsabresd:~# cat /proc/cmdline
console=ttymxc0,115200 root=PARTUUID=6c7357c5-02 rootwait rw quiet crashkernel=96M
root at imx6qdlsabresd:~# kexec --type zImage -p /boot/zImage --dtb=/boot/imx6q-sabresd.dtb --append="console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw 3 maxcpus=1 reset_devices earlycon"
root at imx6qdlsabresd:~# echo c > /proc/sysrq-trigger
[   42.951366] sysrq: SysRq : Trigger a crash
[   42.955711] Unable to handle kernel NULL pointer dereference at virtual address 00000000
...(snip)...
[   43.167849] Backtrace:
[   43.170314] [<c04d1a5c>] (sysrq_handle_crash) from [<c04d2070>] (__handle_sysrq+0xd8/0x258)
[   43.178671]  r5:00000063 r4:c101a6b0
[   43.182258] [<c04d1f98>] (__handle_sysrq) from [<c04d268c>] (write_sysrq_trigger+0x78/0x90)
[   43.190617]  r10:00000000 r9:00000002 r8:00000000 r7:e6490c00 r6:00000000 r5:003b2738
[   43.198450]  r4:00000002
[   43.200995] [<c04d2614>] (write_sysrq_trigger) from [<c02979bc>] (proc_reg_write+0x68/0x90)
[   43.209350]  r5:00000000 r4:c04d2614
[   43.212937] [<c0297954>] (proc_reg_write) from [<c022e50c>] (__vfs_write+0x34/0x134)
[   43.220688]  r9:00000002 r8:003b2738 r7:00000002 r6:e6f33f78 r5:c0297954 r4:e6b47680
[   43.228439] [<c022e4d8>] (__vfs_write) from [<c022e78c>] (vfs_write+0xa8/0x170)
[   43.235756]  r9:00000002 r8:003b2738 r7:e6f33f78 r6:003b2738 r5:e6b47680 r4:00000002
[   43.243508] [<c022e6e4>] (vfs_write) from [<c022e96c>] (SyS_write+0x44/0x98)
[   43.250564]  r9:00000002 r8:003b2738 r7:00000000 r6:00000000 r5:e6b47680 r4:e6b47680
[   43.258320] [<c022e928>] (SyS_write) from [<c0107fe0>] (ret_fast_syscall+0x0/0x28)
[   43.265896]  r9:e6f32000 r8:c01081a4 r7:00000004 r6:b6f0eda8 r5:003b2738 r4:00000002
[   43.273647] Code: e3a04000 e5835000 ee074f9a ebf11af1 (e5c45000)
[   43.279767] CPU 3 will stop doing anything useful since another CPU has crashed
[   43.279771] CPU 2 will stop doing anything useful since another CPU has crashed
[   43.279775] CPU 0 will stop doing anything useful since another CPU has crashed
[   43.301962] Loading crashdump kernel...
[   43.305886] Bye!
[    0.000000] Booting Linux on physical CPU 0x1
[    0.000000] Linux version 4.15.0-rc5-g13f566e (miracle at ar) (gcc version 5.4.0 20160609 (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.4)) #14 SMP Tue Jan 16 06:33:27 UTC 2018


Hiraku Toyooka (1):
  PCI/MSI: add NULL check before use of msi_desc

 drivers/pci/msi.c | 3 +++
 1 file changed, 3 insertions(+)

-- 
2.7.4




More information about the linux-arm-kernel mailing list