Re: [PATCH] pinctrl: mcp23s08: Allocate irq_chip dynamic
From: Jan Kundrát
Date: Tue Mar 05 2019 - 10:27:38 EST
On pondÄlà 21. ledna 2019 14:19:49 CET, Linus Walleij wrote:
On Fri, Jan 11, 2019 at 4:16 PM Lars Poeschel <poeschel@xxxxxxxxxxx> wrote:
Keeping the irq_chip definition static shares it with multiple instances
of the mcp23s08 gpiochip in the system. This is bad and now we get this
warning from gpiolib core:
"detected irqchip that is shared with multiple gpiochips: please fix the
driver."
Hence, move the irq_chip definition from being driver static into the
struct mcp23s08. So a unique irq_chip is used for each gpiochip
instance.
Signed-off-by: Lars Poeschel <poeschel@xxxxxxxxxxx>
Patch applied.
Tested-by: Jan KundrÃt <jan.kundrat@xxxxxxxxx>
Fixes: 171948ea33e14 (gpiolib: check if irqchip already has the irq hook
replacements)
This commit should probably go to 5.0-stable and 4.20-stable as well
because commit 171948ea33e14 first appeared in 4.20. I have been using 4.19
previsouly, which works, but 5.0 oopses on boot for me with two MCP23S17
chips (sorry, I just don't know how to get more than 10 lines of stack
trace in this oops):
[ 1.011926] gpio gpiochip3: (mcp23s17.1): detected irqchip that is
shared with multiple gpiochips: please fix the driver.
[ 1.022936] GPIO line 486 (I2C XOR ready) hogged as input
[ 1.028550] Unable to handle kernel NULL pointer dereference at virtual
address 00000054
[ 1.036675] pgd = (ptrval)
[ 1.039388] [00000054] *pgd=00000000
[ 1.042980] Internal error: Oops: 5 [#1] SMP ARM
[ 1.047613] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 5.0.0 #1
[ 1.053460] Hardware name: Marvell Armada 380/385 (Device Tree)
[ 1.059401] PC is at __dev_printk+0x10/0x84
[ 1.063595] LR is at _dev_info+0x44/0x68
[ 1.067528] pc : [<c0435b50>] lr : [<c0436764>] psr: 20000013
[ 1.073811] sp : ef4afbb4 ip : ef4afbbc fp : eed0a040
[ 1.079048] r10: 00000000 r9 : c0b32834 r8 : 00000000
[ 1.084286] r7 : c016f8cc r6 : 00000000 r5 : ef9f7ba0 r4 : c0b07bc8
[ 1.090829] r3 : ef4afbd8 r2 : ef4afbbc r1 : 00000008 r0 : c08cf6fc
[ 1.097374] Flags: nzCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment
none
[ 1.104528] Control: 10c5387d Table: 0000404a DAC: 00000051
[ 1.110289] Process swapper/0 (pid: 1, stack limit = 0x(ptrval))
[ 1.116311] Stack: (0xef4afbb4 to 0xef4b0000)
[ 1.120679] fba0: c0436764
ef4afbd8 c08f7134
[ 1.128881] fbc0: ef4afbb8 36415da1 c0bbc194 eed0a08c c03bce58 c08f7134
ef714c40 00000000
[ 1.137082] fbe0: eed0a08c 00000002 eecf9840 eed0a064 c0b07bc8 eed0a400
eed0a08c 00000002
[ 1.145283] fc00: eecf9840 c03b9484 00000000 00000001 00000000 00000000
00004c4c 36415da1
[ 1.153485] fc20: 00000000 00000003 eed0a400 00000002 00000000 c09019b8
ef4afc5c c03b97ac
[ 1.161686] fc40: 00000001 ffffffff 00000010 00000001 0000010c c0b07bc8
00000002 00000006
[ 1.169887] fc60: ffffffff 36415da1 00000000 eed0a400 00000000 c0b32768
00000000 00000000
[ 1.178088] fc80: c0b32778 00000000 00000000 c04d0218 c0bb8590 eed0a400
c0bb859c c04391e8
[ 1.186290] fca0: eed0a400 c0b32778 ef4afd1c c0439848 00000001 00000000
00000000 c043965c
[ 1.194491] fcc0: eed0a400 c0b32778 c0b32768 00000000 c0b07bc8 ef4afd1c
c0439848 00000001
[ 1.202692] fce0: 00000000 00000000 00000000 c0437ca4 00000000 ef54cc6c
ef5c8938 36415da1
[ 1.210894] fd00: eed0a400 eed0a400 c0b07bc8 eed0a434 eee79c00 c04394c4
c093b958 eed0a400
[ 1.219095] fd20: 00000001 36415da1 eed0a408 eed0a400 c0b43fd4 eee79c00
eed0a400 c0437e60
[ 1.227296] fd40: eed0a408 c0b07bc8 00000000 c0436244 00000006 c04d56f8
00000000 eed0a400
[ 1.235497] fd60: 000001be 36415da1 eed0a400 eee79c00 00000000 ef575410
00000001 ef9f7bec
[ 1.243699] fd80: c0b07bc8 c04d2620 eee79c00 ef9f7ba0 eed0a400 00000000
00000001 c04d2e4c
[ 1.251900] fda0: 00000000 c05cff48 c0901258 c0913c9c c0913ca8 c0913dd4
00989680 36415da1
[ 1.260102] fdc0: eee79f48 eee79c00 ef575400 eee79f48 ef575410 00000002
c0b07bc8 f0997680
[ 1.268303] fde0: c08d00d8 c04d618c 00000000 c02ab604 c08f7a40 c09141b8
eee79c00 c0b07bc8
[ 1.276504] fe00: 00000003 36415da1 c08fed94 ef575410 00000000 c0b449bc
00000000 00000000
[ 1.284706] fe20: c0b449bc 00000000 c0a5185c c043a8c4 c0bb8590 ef575410
c0bb859c 00000000
[ 1.292907] fe40: 00000000 c04391e8 ef575410 c0b449bc ef575444 c0439768
00000000 c0a5183c
[ 1.301108] fe60: c0a004a8 c043965c ef9f7144 c0439768 00000000 ef575410
c0b449bc ef575444
[ 1.309310] fe80: c0439768 00000000 c0a5183c c0a004a8 c0a5185c c0439844
ef579a34 c0b07bc8
[ 1.317511] fea0: c0b449bc c043771c 00000000 ef484d58 ef579a34 36415da1
c0b3b638 c0b449bc
[ 1.325712] fec0: ef737c80 c0b3b638 00000000 c0438114 c0914250 c0439fa8
c0b449bc c0b449bc
[ 1.333914] fee0: c0b07bc8 c0a2f38c ffffe000 c0439f78 c0b62260 c0b07bc8
c0a2f38c c0a0101c
[ 1.342115] ff00: efffcdb7 c013dd34 c0941a58 c0921800 00000000 00000006
00000006 c08d5294
[ 1.350316] ff20: 00000000 c0b07bc8 c08e2294 c08d5308 c0b64e00 efffcda4
efffcdb2 36415da1
[ 1.358518] ff40: c0a51840 c0b62260 c0a60a80 36415da1 c0b62260 c0a60c44
00000007 c0b64e00
[ 1.366719] ff60: c0b64e00 c0a0139c 00000006 00000006 00000000 c0a004a8
000000b8 00000000
[ 1.374920] ff80: 00000000 00000000 c071f84c 00000000 00000000 00000000
00000000 00000000
[ 1.383121] ffa0: 00000000 c071f854 00000000 c01010e8 00000000 00000000
00000000 00000000
[ 1.391322] ffc0: 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000
[ 1.399523] ffe0: 00000000 00000000 00000000 00000000 00000013 00000000
00000000 00000000
[ 1.407729] [<c0435b50>] (__dev_printk) from [<ef4afbb8>] (0xef4afbb8)
[ 1.414276] Code: e3510000 0a00001a e52de004 e1a0c002 (e591304c)
[ 1.420405] ---[ end trace 1243f20a0e53cc41 ]---
[ 1.425040] Kernel panic - not syncing: Fatal exception
[ 1.430282] CPU1: stopping
[ 1.433000] CPU: 1 PID: 0 Comm: swapper/1 Tainted: G D
5.0.0 #1
[ 1.440242] Hardware name: Marvell Armada 380/385 (Device Tree)
[ 1.446188] [<c01103ac>] (unwind_backtrace) from [<c010c1e4>]
(show_stack+0x10/0x14)
[ 1.453958] [<c010c1e4>] (show_stack) from [<c0708af0>]
(dump_stack+0x88/0x9c)
[ 1.461205] [<c0708af0>] (dump_stack) from [<c010f0b8>]
(handle_IPI+0x348/0x380)
[ 1.468626] [<c010f0b8>] (handle_IPI) from [<c03af568>]
(gic_handle_irq+0x8c/0x90)
[ 1.476220] [<c03af568>] (gic_handle_irq) from [<c0101a0c>]
(__irq_svc+0x6c/0x90)
[ 1.483723] Exception stack(0xef4cdf60 to 0xef4cdfa8)
[ 1.488789] df60: 00000000 00002418 ef9e4de0 c0118940 ffffe000 c0b07bf0
c0b07c30 00000002
[ 1.496991] df80: 00000000 c0b07bc8 c0a69a00 c0b61f0c 00000000 ef4cdfb0
c0108c94 c0108c98
[ 1.505191] dfa0: 60000013 ffffffff
[ 1.508693] [<c0101a0c>] (__irq_svc) from [<c0108c98>]
(arch_cpu_idle+0x38/0x3c)
[ 1.516113] [<c0108c98>] (arch_cpu_idle) from [<c014ccd4>]
(do_idle+0x1c4/0x1fc)
[ 1.523533] [<c014ccd4>] (do_idle) from [<c014cfa8>]
(cpu_startup_entry+0x18/0x20)
[ 1.531124] [<c014cfa8>] (cpu_startup_entry) from [<0010252c>]
(0x10252c)
[ 1.537933] Rebooting in 10 seconds..
If I cherry-pick the following two commits to my 5.0, my board boots once
again:
16f4372fd7a5 pinctrl: mcp23s08: use struct_size() in devm_kzalloc()
19ab5ca9b77d pinctrl: mcp23s08: Allocate irq_chip dynamic
While I am not getting a complete stack trace, it seems likely that the
culprit is indeed 171948ea33e14. It does not add a mere warning, it also
changes behavior so that a chip's irq_enable and irq_disable are not
properly initialized. There's no error code in this function, so the rest
of the code cannot reasonably catch this new behavior. My recommendation
would be to actually get rid of that early return, but if the point is to
*really* get people to notice, well, I noticed :).
As on "why am I hitting this while nobody else did", my board has a shared
IRQ line which is active during bootup, perhaps that might have something
to do with this -- I don't know.
Thanks for this fixup, Lars.
Cheers,
Jan