Yar Tikhiy wrote:
On Thu, Jun 29, 2006 at 01:24:56PM +0400, Maxim Konovalov wrote:
On Thu, 29 Jun 2006, 07:52-0000, Yar Tikhiy wrote:

yar         2006-06-29 07:52:30 UTC

  FreeBSD src repository

  Modified files:
    sys/net              if_vlan.c
  Log:
  Detach the interface first, do vlan_unconfig() then.
  Previously, another thread could get a pointer to the
  interface by scanning the system-wide list and sleep
  on the global vlan mutex held by vlan_unconfig().
  The interface was gone by the time the other thread
  woke up.

  In order to be able to call vlan_unconfig() on a detached
  interface, remove the purely cosmetic bzero'ing of IF_LLADDR
  from the function because a detached interface has no addresses.

  Noticed by:     a stress-testing script by maxim
  Reviewed by:    glebius
Still no cookie :-)

db> bt
Tracing pid 75800 tid 100098 td 0xc2b0e960
in_control(c2a1c67c,c02069f6,c40eece0,c2e66000,c2b0e960) at in_control+0x114
ifioctl(c2a1c67c,c02069f6,c40eece0,c2b0e960,0,...) at ifioctl+0xee
soo_ioctl(c27cb4c8,c02069f6,c40eece0,c2c04980,c2b0e960) at soo_ioctl+0x2db
ioctl(c2b0e960,d56a4d04) at ioctl+0x370
syscall(3b,3b,3b,bfbfe2c4,0,...) at syscall+0x27e
Xint0x80_syscall() at Xint0x80_syscall+0x1f
--- syscall (54, FreeBSD ELF32, ioctl), eip = 0x2817cb43, esp =
0xbfbfe28c, ebp = 0xbfbfe2d8 ---

Let me know if you need more info.

I stress tested gif(4) in the same manner for kicks and got a very
similar panic in in_control().  I suppose that my change eliminated
a concurrency problem in vlan(4) and we began to feel the lack of
refcounting at ifnet level.  Indeed, a thread can keep a pointer
to an ifnet beyond its lifetime and panic the system on access to
the dead ifnet.

For the time being we should simply mark ifnet's dead but keep them
around. Refcounting is most likely too expensive, especially on larger
SMP systems. All users of ifnets then have to be teached to obey the
dead flag.

--
Andre

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

Reply via email to