Lock Order Reversal on 7.0-STABLE with pf and ipfw / dummynet
(traces)
Alex Popa
razor at dataxnet.ro
Tue Mar 25 12:21:02 PDT 2008
On Sat, Mar 22, 2008 at 04:55:28PM +0100, Max Laier wrote:
> Hi Alex,
>
> On Saturday 22 March 2008 11:29:33 Alex Popa wrote:
> > Sorry for the big delay, but here are the traces you requested.
>
> don't worry, you are a great help!
>
> Could you try the attached patch? I missed the fact that you are using
> FASTROUTE in your setup. There is obviously a problem with it, but the
> attached patch should work around that. The other LOR really is harmless
> and rather an oversight in WITNESS: a LOR with a shared/read lock can't
> cause a deadlock (unless there is also a LOR with the same lock in
> exclusive mode). But this is rather complex to check and might not be
> easily implemented in WITNESS.
>
> Anyways - I believe this patch should work around your problem. Let us
> know your findings - thanks.
Hello.
I have tested the patch, booted with a WITNESS kernel including that
patch, and it has locked up (solid again, no numlock or console
changing, no control-alt-esc to debugger) after about 41 minutes
(timestamps in /var/log/all.log go from 19:12:57 to 19:53:40).
I did get two LOR reports in dmesg, they are attached.
> --
> /"\ Best regards, | mlaier at freebsd.org
> \ / Max Laier | ICQ #67774661
> X http://pf4freebsd.love2party.net/ | mlaier at EFnet
> / \ ASCII Ribbon Campaign | Against HTML Mail and News
Alex
--
"Computer science is no more about computers
than astronomy is about telescopes" -- E. W. Dijkstra
-------------- next part --------------
lock order reversal:
1st 0xffffffff8096ebc8 PFil hook read/write mutex (PFil hook read/write mutex) @ /usr/src/sys/net/pfil.c:73
2nd 0xffffffff8096f8e8 udp (udp) @ /usr/src/sys/netinet/udp_usrreq.c:385
KDB: stack backtrace:
db_trace_self_wrapper() at db_trace_self_wrapper+0x2a
witness_checkorder() at witness_checkorder+0x539
_mtx_lock_flags() at _mtx_lock_flags+0x1f
udp_input() at udp_input+0x1f7
ip_input() at ip_input+0xa7
dummynet_send() at dummynet_send+0xde
dummynet_io() at dummynet_io+0x587
ipfw_check_in() at ipfw_check_in+0x241
pfil_run_hooks() at pfil_run_hooks+0xac
ip_input() at ip_input+0x292
ether_demux() at ether_demux+0x1ac
ether_input() at ether_input+0x1bf
em_handle_rxtx() at em_handle_rxtx+0x1d2
taskqueue_run() at taskqueue_run+0x95
taskqueue_thread_loop() at taskqueue_thread_loop+0x53
fork_exit() at fork_exit+0x112
fork_trampoline() at fork_trampoline+0xe
--- trap 0, rip = 0, rsp = 0xffffffffa057ad30, rbp = 0 ---
[...]
lock order reversal:
1st 0xffffff00018ff690 inp (rawinp) @ /usr/src/sys/netinet/raw_ip.c:281
2nd 0xffffffff8096ebc8 PFil hook read/write mutex (PFil hook read/write mutex) @ /usr/src/sys/net/pfil.c:73
KDB: stack backtrace:
db_trace_self_wrapper() at db_trace_self_wrapper+0x2a
witness_checkorder() at witness_checkorder+0x539
_rw_rlock() at _rw_rlock+0x25
pfil_run_hooks() at pfil_run_hooks+0x44
ip_output() at ip_output+0x35a
rip_output() at rip_output+0x1eb
sosend_generic() at sosend_generic+0x289
kern_sendit() at kern_sendit+0x122
sendit() at sendit+0xc6
sendto() at sendto+0x4d
syscall() at syscall+0x1b5
Xfast_syscall() at Xfast_syscall+0xab
--- syscall (133, FreeBSD ELF64, sendto), rip = 0x80091132c, rsp = 0x7ffffffee6e8, rbp = 0x40 ---
More information about the freebsd-stable
mailing list