On Mon, 8 Aug 2005, Ed Maste wrote:

I built a vanilla (i.e. without local patches) kernel with
the recent multicast locking changes, and got the following
LOR:

Ed,

Could you add a hard-coded entry to WITNESS to place the udpinp lock
before the in_multi_mtx in the lock order, and let me know which path
resulted in the opposite order from this one?  In theory, pcb locks
should appear before the inet multicast address lock.  The only case
I'm aware of right now that might cause problems is IGMP's call into
ip_output() to send an IGMP message, and ip_output() could hit ipfw/
pf/etc acquiring an inpcb lock.  There might also be recursion back
into ip_input() due to multicast, which is the case I'm curious about.

I had been wondering if we need to defer the ip_output() call for
IGMP to a separate worker context, and assuming you're hitting a case
related to that, I think that we'll need to.  There was already a
warning about potential recursion there in the IGMP source.

Thanks,

Robert N M Watson

Lock order reversal
1st 0xa26ffaec inp (udpinp) @ 
/d2/emaste/cvs_mcast/src/sys/netinet/udp_usrreq.c:762
2nd 0xa07ebf60 in_multi_mtx (in_multi_mtx) @ 
d2/emaste/cvs_mcast/src/sys/netinet/ip_output.c:294
KDB: stack backtrace:
kdb_backtrace(0,ffffffff,a07ab3b8,a07ab480,a075e1e0) at 0xa0586a95 = 
kdb_backtrace+0x29
witness_checkorder(a07ebf60,9,a0729936,126) at 0xa0590c60 = 
witness_checkorder+0x564
_mtx_lock_flags(a07ebf60,0,a0729936,126,0) at 0xa0566610 = _mtx_lock_flags+0x60
ip_output(a2706a00,0,c8463b08,20,a26a9500) at 0xa05f7d8a = ip_output+0x3fe
udp_output(a26ffa5c,a2706a00,0,0,a29b9900) at 0xa060754f = udp_output+0x4a7
udp_send(a29b2ca0,0,a2911900,0,0) at 0xa0607abe = udp_send+0x1a
sosend(a29b2ca0,0,c8463cbc,a2911900,0) at 0xa05a8287 = sosend+0x5e3
soo_write(a26d79d8,c8463cbc,a2605800,0,a29b9900) at 0xa059810a = soo_write+0x46
dofilewrite(a29b9900,c,a26d79d8,c8463cbc,ffffffff) at 0xa0592903 = 
dofilewrite+0x77
kern_writev(a29b9900,c,c8463cbc,842b12a,0) at 0xa05927a7 = kern_writev+0x3b
write(a29b9900,c8463d04,3,0,282) at 0xa05926cd = write+0x45
syscall(685a003b,804003b,9fbf003b,821c400,f6) at 0xa06c75b3 = syscall+0x25b
Xint0x80_syscall() at 0xa06b4ccf = Xint0x80_syscall+0x1f
--- syscall (4, FreeBSD ELF32, write), eip = 0x681e31af, esp = 0x9f9ff9fc, ebp 
= 0x9f9ffa18 ---

--
Ed Maste, Sandvine Incorporated
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to