Panic in netnatm
Craig Rodrigues
rodrigc at crodrigues.org
Tue Jul 26 14:53:37 GMT 2005
On Tue, Jul 26, 2005 at 03:17:12PM +0200, Pawel Jakub Dawidek wrote:
> +> panic: mutex natm_mtx not owned at /usr/src/sys/netnatm/natm_pcb.c:110
>
> Trace will probably not be needed, as there are only two places where
> npcb_add() is called.
> It looks like NATM locking is missing in /sys/netinet/if_atm.c.
Ahh, thanks Pawel! You saved me some time.
It looks like locks must be held before npcb_free() and npcb_add() are
called. It looks like Harti is on vacation, so can you help Robert?
Is something like this needed?
--- if_atm.c.orig Tue Jul 26 10:28:42 2005
+++ if_atm.c Tue Jul 26 10:37:28 2005
@@ -224,11 +224,15 @@
sin = (struct sockaddr_in *) rt_key(rt);
if (sin->sin_family != AF_INET)
goto failed;
+ NATM_LOCK();
npcb = npcb_add(NULL, rt->rt_ifp, op.param.vci, op.param.vpi);
- if (npcb == NULL)
+ if (npcb == NULL) {
+ NATM_UNLOCK();
goto failed;
+ }
npcb->npcb_flags |= NPCB_IP;
npcb->ipaddr.s_addr = sin->sin_addr.s_addr;
+ NATM_UNLOCK();
/* XXX: move npcb to llinfo when ATM ARP is ready */
rt->rt_llinfo = (caddr_t) npcb;
rt->rt_flags |= RTF_LLINFO;
@@ -252,9 +256,11 @@
failed:
#ifdef NATM
if (npcb) {
+ NATM_LOCK();
npcb_free(npcb, NPCB_DESTROY);
rt->rt_llinfo = NULL;
rt->rt_flags &= ~RTF_LLINFO;
+ NATM_UNLOCK();
}
#endif
/* mark as invalid. We cannot RTM_DELETE the route from
@@ -269,10 +275,12 @@
* tell native ATM we are done with this VC
*/
if (rt->rt_flags & RTF_LLINFO) {
+ NATM_LOCK();
npcb_free((struct natmpcb *)rt->rt_llinfo,
NPCB_DESTROY);
rt->rt_llinfo = NULL;
rt->rt_flags &= ~RTF_LLINFO;
+ NATM_UNLOCK();
}
#endif
/*
--
Craig Rodrigues
rodrigc at crodrigues.org
More information about the freebsd-current
mailing list