On Thu, Dec 29, 2016 at 09:39:08AM +0100, Martin Pieuchot wrote: > On 23/12/16(Fri) 16:33, Stefan Sperling wrote: > > When I kill pppd, running on top of umsm(4), I see the following splasserts: > > Thanks for the report. > > > End of stack trace. > > splassert: sorwakeup: want 1 have 0 > > Starting stack trace... > > sorwakeup(1,0,d09d9be1,0,9cee1169) at sorwakeup+0x3f > > sorwakeup(d90f89f8,d0b58b50,d900c600,0,d0d31bb8) at sorwakeup+0x3f > > route_input(d900c600,d0b58b60,d0b58b50,d0b58b40,d09d086b) at > > route_input+0x26a > > rt_ifmsg(d40ee000,d09dd1e7,d09dd1e7,d03baa39,80) at rt_ifmsg+0xb2 > > if_linkstate(d40ee000,d09deb02,ffffffe9,f60d1bac,d03b0da5) at > > if_linkstate+0x64 > > pppdealloc(d40ee000,3,f60d1bec,d03b10f4,f60d1bd8) at pppdealloc+0x36 > > pppclose(d40f8600,3,d90b8300,d9734e18,d9734e18) at pppclose+0x77 > > ttioctl(d40f8600,8004741b,f60d1e74,3,d90b8300) at ttioctl+0x6e3 > > ucom_do_ioctl(d40f7a00,8004741b,f60d1e74,3,d90b8300) at ucom_do_ioctl+0x81 > > ucomioctl(4280,8004741b,f60d1e74,3,d90b8300,0,d96c9218,d03ec5d2,d96c91c8,d96c91c8,f60d1d6c,d03e899f) > > at ucomioctl+0x6b > > spec_ioctl(f60d1d60,8004667d,f60d1ef0,d960a180,8004741b) at spec_ioctl+0x9b > > VOP_IOCTL(d960a180,8004741b,f60d1e74,3,d97a3c00) at VOP_IOCTL+0x4b > > vn_ioctl(d90b51b8,8004741b,f60d1e74,d90b8300,27) at vn_ioctl+0x7e > > sys_ioctl(d90b8300,f60d1f5c,f60d1f7c,0,286) at sys_ioctl+0x19f > > syscall() at syscall+0x250 > > pppdealloc() is always called in process context, the splsoftassert() is > currently valid because the function is called at spltty(), but now we > need the NET_LOCK() so the diff below should do the trick. > > ok?
OK bluhm@ > > Index: net/if_ppp.c > =================================================================== > RCS file: /cvs/src/sys/net/if_ppp.c,v > retrieving revision 1.102 > diff -u -p -r1.102 if_ppp.c > --- net/if_ppp.c 16 Nov 2016 14:23:10 -0000 1.102 > +++ net/if_ppp.c 29 Dec 2016 08:37:19 -0000 > @@ -306,9 +306,9 @@ void > pppdealloc(struct ppp_softc *sc) > { > struct ppp_pkt *pkt; > + int s; > > - splsoftassert(IPL_SOFTNET); > - > + NET_LOCK(s); > if_down(&sc->sc_if); > sc->sc_if.if_flags &= ~(IFF_UP|IFF_RUNNING); > sc->sc_devp = NULL; > @@ -343,6 +343,7 @@ pppdealloc(struct ppp_softc *sc) > sc->sc_comp = 0; > } > #endif > + NET_UNLOCK(s); > } > > /*