Page fault in IFNET_WLOCK_ASSERT [if.c and pccbb.c]
Harsha Srinath
inpcb.harsha at gmail.com
Sun Oct 11 19:40:20 UTC 2009
Hi all,
I'm running an updated HEAD kernel and got a page fault in
ifindex_alloc_locked() in if.c. I figured that the problem was caused
by the (pluggable) network card of my laptop and found that during the
initialization of the interface, cb_event_thread() takes the giant
lock and up the call chain in if_alloc(), we call IFNET_WLOCK() and
assert on the RW locks in ifindex_alloc_locked(). It is in the asset
macro IFNET_WLOCK_ASSERT() I see the page fault.
I looked up some recent related changes and noticed the following
comment in one of the check-ins in-
http://svn.freebsd.org/viewvc/base/head/sys/net/if.c
"Break out allocation of new ifindex values from if_alloc() and if_vmove(),
and centralize in a single function ifindex_alloc(). Assert the
IFNET_WLOCK, and add missing IFNET_WLOCK in if_alloc(). This does not
close all known races in this code."
So I think I have hit one of those fault conditions.
Apparently the giant lock code was removed and added back recently -
http://svn.freebsd.org/viewvc/base/head/sys/dev/pccbb/pccbb.c
I believe that the root cause is that ifnet_rw is a non sleepable
exclusive RW lock and we have taken the exclusive sleep mutex Giant
before that.
Any pointers and suggestions are welcome.
Many thanks,
Harsha
More information about the freebsd-net
mailing list