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

Reply via email to