NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
kern/48733: deadlock in if_output() with interrupt on KERNEL_LOCK
>Number: 48733
>Category: kern
>Synopsis: deadlock in if_output() with interrupt on KERNEL_LOCK
>Confidential: no
>Severity: critical
>Priority: high
>Responsible: kern-bug-people
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Fri Apr 11 14:40:00 +0000 2014
>Originator: Wolfgang Stukenbrock
>Release: NetBSD 6.1 - MAIN
>Organization:
Dr. Nagler & Company GmbH
>Environment:
System: NetBSD e013 6.1 NetBSD 6.1 (NSW-E013) #64: Tue Oct 22 11:03:30 CEST
2013
wgstuken@s012:/export/NetBSD-6.1/N+C-build/.OBJDIR_amd64/export/NetBSD-6.1/src/sys/arch/amd64/compile/NSW-E013
amd64
Architecture: x86_64
Machine: amd64
>Description:
Problem located in /src/sys/netinet/ip_output.c.
Since file revision 1.208 the Kernel-Lock is locked prior calling
if_output
on the interface.
Now - at least the wm-driver - will call splnet() and splx() inside the
output
routine.
If any interrupt occurs in between splnet() and splx(), the interrupt
is delayed and
is processes in splx() when the level is released again.
If such an interrupt is e.g. not MP-SAFE, the call stup in
intr_biglock_wrapper() is
used to call the interrupt routine and that one will lock the
KERNEL-LOCK again.
So we try to lock it again here -> dead-lock.
Our system runs fine with 4 8257x interfaces, but after adding 2
additional 8254x
interfaces, the system lock-up after a short time. Don't ask me, why
the if_output
call takes "to long" with theese two additonal interfaces, but it is
reproducable.
I've analysed this several times with DDB. Most times I've seen an
USB-interrupt
that dead-lock the system.
>How-To-Repeat:
Run a lot of trafic over wm-interfaces and do shomething e.g. on USB at
the same
time. It is just a question of time till system-dead-lock.
>Fix:
Fist guess: revert change done from 1.207 to 1.208.
But I've no idea about side effects.
>Unformatted:
Home |
Main Index |
Thread Index |
Old Index