Kernel locks when configuring motherboard ethernet

John Klos <[email protected]>
Newsgroups gmane.os.netbsd.devel.kernel
Message-ID <[email protected]>
Hi, all,

On several amd64 systems which boot via UEFI, the first attempt to make 
changes to the built-in Realtek ethernet port locks the kernel.

I observed this issue a while ago, but only on old (2014) AMD AM1 
motherboards, so I thought it was a quirk of older UEFI. I noticed this 
issue didn't happen if I configured BIOS settings to enable the network 
stack, even though I don't turn on PXE for either IPv4 or IPv6. I figured 
NetBSD isn't initializing the re* interface properly when booting via 
UEFI, but the BIOS does, so problem circumvented.

However, I've recently set up some newer systems that've been showing the 
same issue. They are Ryzen AM4 and AM5 systems with BIOSes that've been 
updated within the last month or two.

The observed behavior is that if the network is very busy when the system 
boots, a majority of the time the kernel will lock. If the network is 
idle, the kernel won't lock up.

In the past, I've never been able to get in to the kernel debugger, since 
the lockup prevents all keyboard activity, but I have a colocated system 
with a serial console where I can drop in to the debugger.

Here's what I got after a lockup after trying to configure re0:

[  30.8543400] fatal breakpoint trap in supervisor mode
[  30.8543400] trap type 1 code 0 rip 0xffffffff80235385 cs 0x8 rflags 0x202 cr2 0x7f7ede210ff8 ilevel 0x8 rsp 0xffffc48839ae4be8
[  30.8543400] curlwp 0xffff8fdc02285100 pid 0.11 lowest kstack 0xffffc48839ae02c0
Stopped in pid 0.11 (system) at netbsd:breakpoint+0x5:  leave
breakpoint() at netbsd:breakpoint+0x5
comintr() at netbsd:comintr+0x86d
intr_kdtrace_wrapper() at netbsd:intr_kdtrace_wrapper+0x26
Xhandle_ioapic_edge1() at netbsd:Xhandle_ioapic_edge1+0x75
--- interrupt ---
bus_space_read_2() at netbsd:bus_space_read_2+0xb
intr_biglock_wrapper() at netbsd:intr_biglock_wrapper+0x37
Xhandle_ioapic_edge18() at netbsd:Xhandle_ioapic_edge18+0x75
--- interrupt ---
_kernel_lock() at netbsd:_kernel_lock+0xca
if_link_state_change_work() at netbsd:if_link_state_change_work+0x1e
workqueue_worker() at netbsd:workqueue_worker+0xd9
ds          5c20
es          4c18
fs          524
gs          5230
rdi         ffffffff81845120    x86_io
rsi         3f8
rbp         ffffc48839ae4be8
rbx         ffffc4803df8c006
rdx         1
rcx         100
rax         7f
r8          0
r9          0
r10         ffffc4884f9f8eec
r11         ffffc4884f9f8ee8
r12         ffff8fd5096a1790
r13         7fd
r14         c6
r15         ffff8fd5096a16c0
rip         ffffffff80235385    breakpoint+0x5
cs          8
rflags      202
rsp         ffffc48839ae4be8
ss          10
netbsd:breakpoint+0x5:  leave


Also, I tried a kernel with LOCKDEBUG and it paniced before finishing boot:

Configuring network interfaces: re0[  22.9855318] cpu0[564 sh]: hogging kernel lock
[  22.9855318] ipi_msg_cpu_handler() at netbsd:ipi_msg_cpu_handler+0x56
[  22.9855318] ipi_cpu_handler() at netbsd:ipi_cpu_handler+0x70
[  22.9855318] x86_ipi_handler() at netbsd:x86_ipi_handler+0x6f
[  22.9855318] Xresume_lapic_ipi() at netbsd:Xresume_lapic_ipi+0x18
[  22.9855318] --- interrupt ---
[  22.9855318] Xspllower() at netbsd:Xspllower+0xe
[  22.9855318] Xresume_lapic_ltimer() at netbsd:Xresume_lapic_ltimer+0x1e
[  22.9855318] --- interrupt ---
[  22.9855318] bus_space_read_2() at netbsd:bus_space_read_2+0xb
[  22.9855318] intr_biglock_wrapper() at netbsd:intr_biglock_wrapper+0x37
[  22.9855318] Kernel lock error: _kernel_lock,266: spinout

[  23.7255334] lock address : netbsd:kernel_lock
[  23.7755332] type         : spin
[  23.8155330] initialized  : netbsd:main+0x31
[  23.8655316] shared holds :                  0 exclusive:                  1
[  23.9555319] shares wanted:                  0 exclusive:                  1
[  24.0355338] relevant cpu :                  1 last held:                  0
[  24.1155337] relevant lwp : 0xfffff8a0cd91e680 last held: 0xfffff8a0d003fac0
[  24.2055344] last locked* : netbsd:intr_biglock_wrapper+0x15
[  24.2655342] unlocked     : netbsd:softint_dispatch+0x186
[  24.3355336] curcpu holds :                  0 wanted by: 0xfffff8a0cd91e680

[  24.4155346] panic: LOCKDEBUG: Kernel lock error: _kernel_lock,266: spinout
[  24.4955330] cpu1: Begin traceback...
[  24.5455334] vpanic() at netbsd:vpanic+0x183
[  24.5955350] panic() at netbsd:panic+0x3c
[  24.6455370] lockdebug_abort1() at netbsd:lockdebug_abort1+0xe6
[  24.7055350] _kernel_lock() at netbsd:_kernel_lock+0x2a7
[  24.7755337] softint_dispatch() at netbsd:softint_dispatch+0x16d
[  24.8455340] DDB lost frame for netbsd:Xsoftintr+0x4c, trying 0xffff9a0839ba30f0
[  24.9255357] Xsoftintr() at netbsd:Xsoftintr+0x4c
[  24.9855339] --- interrupt ---
[  25.0155356] 0:
[  25.0355354] cpu1: End traceback...

[  25.0855358] dumping to dev 168,2 (offset=68267703, size=8243720):
[  25.1555346] dump 1262 1261 1260 1259 1258 1257 1256 1255 1254 1253 1252 1251 1250 1249 1248 1247 1246 1245 1244 1243 1242 1241 
...


Since using the LOCKDEBUG kernel, this system can't use the network at all 
without locking up, even after a hardware reset. It's colocated, so while 
I can have someone physically power cycle the machine, I figured I'd leave 
it in case more information can be gained from it as it is.

The serial console can be accessed via another system via cu, and the 
other system can also do a hardware reset. The system obviously can't talk 
on the Internet, but it has netbsd-10 sources and can compile a kernel for 
itself.

The previous kernel that has been running for a couple of weeks had locked 
up twice, and I don't know if that's directly related to this, because it 
had nothing to do with configuring network ports. Interestingly, I've seen 
the same lockups with the previous machine that this machine replaced 
(8 gig Raspberry Pi 4, netbsd-10). These machines are public facing and 
are routing parts of a class C over tinc tunnels.

Here's one lockup:

[ 495715.4076245] fatal breakpoint trap in supervisor mode
[ 495715.4076245] trap type 1 code 0 rip 0xffffffff80235385 cs 0x8 rflags 0x202 cr2 0x76f4a20740
00 ilevel 0x8 rsp 0xffffa80839aac8c8
[ 495715.4076245] curlwp 0xffffa0ed91107480 pid 0.3 lowest kstack 0xffffa80839aa82c0
Stopped in pid 0.3 (system) at  netbsd:breakpoint+0x5:  leave
breakpoint() at netbsd:breakpoint+0x5
comintr() at netbsd:comintr+0x7e0
intr_kdtrace_wrapper() at netbsd:intr_kdtrace_wrapper+0x26
Xhandle_ioapic_edge1() at netbsd:Xhandle_ioapic_edge1+0x75
--- interrupt ---
npf_tcpsaw() at netbsd:npf_tcpsaw+0x1d
npf_conn_inspect() at netbsd:npf_conn_inspect+0x86
npfk_packet_handler() at netbsd:npfk_packet_handler+0x18e
pfil_run_hooks() at netbsd:pfil_run_hooks+0x128
ip_output() at netbsd:ip_output+0x4c0
ip_forward() at netbsd:ip_forward+0x138
ipintr() at netbsd:ipintr+0xa80
softint_dispatch() at netbsd:softint_dispatch+0x95
DDB lost frame for netbsd:Xsoftintr+0x4c, trying 0xffffa80839aad0f0
Xsoftintr() at netbsd:Xsoftintr+0x4c
--- interrupt ---
b31c059c10208e97:
ds          c9a0
es          ddb3
fs          1
gs          e8d9
rdi         ffffffff81845120    x86_io
rsi         800
rbp         ffffa80839aac8c8
rbx         ffffa8003df8c01c
rdx         7f
rcx         22
rax         1
r8          ffffa80839aaca94
r9          0
r10         5ed7b6ca02a0
r11         ffffa8003df91008
r12         ffffa0e6944a1790
r13         800
r14         cc
r15         ffffa0e6944a16c0
rip         ffffffff80235385    breakpoint+0x5
cs          8
rflags      202
rsp         ffffa80839aac8c8
ss          0
netbsd:breakpoint+0x5:  leave


Does anyone have any suggestions about what to try next? Does anyone want 
to have a look around themselves?

Thanks,
John Klos
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.