mld6_{start,stop}_listeting() are called in ioctl(2) context, thus at IPL_SOFTNET.
mld6_fasttimeo(), like all *fasttimeo() routines is now always called at IPL_SOFTNET. 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