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 _at__at_ -224,11 +224,15 _at__at_ 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; _at__at_ -252,9 +256,11 _at__at_ 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 _at__at_ -269,10 +275,12 _at__at_ * 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.orgReceived on Tue Jul 26 2005 - 12:53:37 UTC
This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:38:39 UTC