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);
>  }
>  
>  /*

Reply via email to