On Tue, Dec 20, 2016 at 12:14:22PM +0100, Martin Pieuchot wrote: > mld6_{start,stop}_listeting() are called in ioctl(2) context, thus at > IPL_SOFTNET.
These are called from in6_addmulti() and in6_delmulti(). They still have a splsoftnet() in them. Please remove this first and put an assert there. > mld6_fasttimeo(), like all *fasttimeo() routines is now always called > at IPL_SOFTNET. OK bluhm@ for that. > > So let's get rid of these recursive splsoftnet(), ok? > > Index: netinet6/mld6.c > =================================================================== > RCS file: /cvs/src/sys/netinet6/mld6.c,v > retrieving revision 1.48 > diff -u -p -r1.48 mld6.c > --- netinet6/mld6.c 5 Jul 2016 10:17:14 -0000 1.48 > +++ netinet6/mld6.c 20 Dec 2016 10:59:27 -0000 > @@ -117,8 +117,6 @@ mld6_init(void) > void > mld6_start_listening(struct in6_multi *in6m) > { > - int s = splsoftnet(); > - > /* > * RFC2710 page 10: > * The node never sends a Report or Done for the link-scope all-nodes > @@ -139,14 +137,11 @@ mld6_start_listening(struct in6_multi *i > in6m->in6m_state = MLD_IREPORTEDLAST; > mld_timers_are_running = 1; > } > - splx(s); > } > > void > mld6_stop_listening(struct in6_multi *in6m) > { > - int s = splsoftnet(); > - > mld_all_nodes_linklocal.s6_addr16[1] = htons(in6m->in6m_ifidx);/* XXX */ > mld_all_routers_linklocal.s6_addr16[1] = > htons(in6m->in6m_ifidx); /* XXX: necessary when mrouting */ > @@ -156,7 +151,6 @@ mld6_stop_listening(struct in6_multi *in > __IPV6_ADDR_MC_SCOPE(&in6m->in6m_addr) > > __IPV6_ADDR_SCOPE_INTFACELOCAL) > mld6_sendpkt(in6m, MLD_LISTENER_DONE, > &mld_all_routers_linklocal); > - splx(s); > } > > void > @@ -331,7 +325,6 @@ void > mld6_fasttimeo(void) > { > struct ifnet *ifp; > - int s; > > /* > * Quick check to see if any work needs to be done, in order > @@ -340,11 +333,9 @@ mld6_fasttimeo(void) > if (!mld_timers_are_running) > return; > > - s = splsoftnet(); > mld_timers_are_running = 0; > TAILQ_FOREACH(ifp, &ifnet, if_list) > mld6_checktimer(ifp); > - splx(s); > } > > void