From owner-freebsd-hackers Mon Feb 7 20: 5:41 2000 Delivered-To: freebsd-hackers@freebsd.org Received: from apollo.backplane.com (apollo.backplane.com [216.240.41.2]) by builder.freebsd.org (Postfix) with ESMTP id 276B23E10; Mon, 7 Feb 2000 20:05:32 -0800 (PST) Received: (from dillon@localhost) by apollo.backplane.com (8.9.3/8.9.1) id UAA52606; Mon, 7 Feb 2000 20:06:00 -0800 (PST) (envelope-from dillon) Date: Mon, 7 Feb 2000 20:06:00 -0800 (PST) From: Matthew Dillon Message-Id: <200002080406.UAA52606@apollo.backplane.com> To: "Rodney W. Grimes" Cc: bmilekic@dsuper.net (Bosko Milekic), freebsd-stable@FreeBSD.ORG, freebsd-hackers@FreeBSD.ORG, peter@FreeBSD.ORG Subject: Re: rtfree panic() (fwd) References: <200002080143.RAA19125@gndrsh.dnsmgr.net> Sender: owner-freebsd-hackers@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.ORG :No, this problem was fixed in -current with this commit (you looked at :the wrong file, fix was in route.h): : :revision 1.30 :date: 1999/06/30 23:11:15; author: msmith; state: Exp; lines: +2 -3 :Increase the size of the route reference count from 15 bits to 31 bits. : :This doesn't change the size or alignment of the structure on either i386 :or Alpha, and thus should be binary-compatible (modulo problems with old :applications and routes with more than 2^15 references). :... :> #9 0xc015e343 in if_unroute (ifp=0xc023ebc4, flag=1, fam=0) :> at ../../net/if.c:414 :> #10 0xc015e3cf in if_down (ifp=0xc023ebc4) at ../../net/if.c:449 :> #11 0xc01e7308 in etp_linkdown () :> #12 0xc01e97ab in cisco_keepalive () :> #13 0xc01e9ba8 in cisco_notify () :> #14 0xc01ecbad in etp_notify () :> ---Type to continue, or q to quit--- :> #15 0xc01e91e4 in hdlc_rcvhandler () :> #16 0xc01cf35e in l3_rcvhandler () :> #17 0xc01c857d in lind_event () :> #18 0xc01e7445 in hdlc_timeout () :> #19 0xc0130112 in softclock () at ../../kern/kern_timeout.c:132 :> :> --- :-- :Rod Grimes - KD7CAX @ CN85sl - (RWG25) rgrimes@gndrsh.dnsmgr.net I am only partially familiar with this sync board. I don't know what the bug is but I strongly suspect that if_down() is not being called at splnet() by the sync board's driver code. It might be possible to test this hypothesis by modifying the if_down() routine in net/if.c to surround it with an splnet() call, e.g.: /* * Mark an interface down and notify protocols of * the transition. * NOTE: must be called at splnet or eqivalent. */ void if_down(ifp) register struct ifnet *ifp; { int s = splnet(); /* ADDME */ if_unroute(ifp, IFF_UP, AF_UNSPEC); splx(s); /* ADDME */ } And see if that solves the problem. We fixed another similar bug last year in regards to the low-memory garbage collection code not freeing routes at the correct spl. There could be other similar problems. I recall that this driver's source is not distributed. If I'm wrong then there is an avenue to pursue with the source (namely determining if the source calls the IF routines at the correct spl). -Matt Matthew Dillon To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-hackers" in the body of the message