Re: recursive splsoftnet() in ND6

2016-11-28 Thread Alexander Bluhm
On Mon, Nov 28, 2016 at 12:31:39PM +0100, Martin Pieuchot wrote:
> This kill multiple recursive splsoftnet(), ok? 

OK bluhm@

> 
> Index: netinet6/nd6.h
> ===
> RCS file: /cvs/src/sys/netinet6/nd6.h,v
> retrieving revision 1.64
> diff -u -p -r1.64 nd6.h
> --- netinet6/nd6.h21 Nov 2016 10:52:08 -  1.64
> +++ netinet6/nd6.h28 Nov 2016 11:19:49 -
> @@ -288,13 +288,10 @@ void nd6_rs_detach(struct ifnet *);
>  void nd6_rs_input(struct mbuf *, int, int);
>  
>  void prelist_del(struct nd_prefix *);
> -void defrouter_addreq(struct nd_defrouter *);
>  void defrouter_reset(void);
>  void defrouter_select(void);
>  void defrtrlist_del(struct nd_defrouter *);
>  void prelist_remove(struct nd_prefix *);
> -int nd6_prelist_add(struct nd_prefix *, struct nd_defrouter *,
> - struct nd_prefix **);
>  void pfxlist_onlink_check(void);
>  struct nd_defrouter *defrouter_lookup(struct in6_addr *, unsigned int);
>  
> Index: netinet6/nd6_rtr.c
> ===
> RCS file: /cvs/src/sys/netinet6/nd6_rtr.c,v
> retrieving revision 1.151
> diff -u -p -r1.151 nd6_rtr.c
> --- netinet6/nd6_rtr.c21 Nov 2016 10:56:26 -  1.151
> +++ netinet6/nd6_rtr.c28 Nov 2016 11:25:24 -
> @@ -70,6 +70,9 @@ int nd6_prefix_onlink(struct nd_prefix *
>  int nd6_prefix_offlink(struct nd_prefix *);
>  void in6_init_address_ltimes(struct nd_prefix *, struct in6_addrlifetime *);
>  int prelist_update(struct nd_prefix *, struct nd_defrouter *, struct mbuf *);
> +int nd6_prelist_add(struct nd_prefix *, struct nd_defrouter *,
> + struct nd_prefix **);
> +void defrouter_addreq(struct nd_defrouter *);
>  int rt6_deleteroute(struct rtentry *, void *, unsigned int);
>  
>  void nd6_addr_add(void *);
> @@ -578,7 +581,6 @@ defrouter_addreq(struct nd_defrouter *ne
>   struct rt_addrinfo info;
>   struct sockaddr_in6 def, mask, gate;
>   struct rtentry *rt;
> - int s;
>   int error;
>  
>   memset(, 0, sizeof(def));
> @@ -597,7 +599,6 @@ defrouter_addreq(struct nd_defrouter *ne
>   info.rti_info[RTAX_GATEWAY] = sin6tosa();
>   info.rti_info[RTAX_NETMASK] = sin6tosa();
>  
> - s = splsoftnet();
>   error = rtrequest(RTM_ADD, , RTP_DEFAULT, ,
>   new->ifp->if_rdomain);
>   if (error == 0) {
> @@ -605,8 +606,6 @@ defrouter_addreq(struct nd_defrouter *ne
>   rtfree(rt);
>   new->installed = 1;
>   }
> - splx(s);
> - return;
>  }
>  
>  struct nd_defrouter *
> @@ -663,7 +662,7 @@ defrtrlist_del(struct nd_defrouter *dr)
>  
>   ext->ndefrouters--;
>   if (ext->ndefrouters < 0) {
> - log(LOG_WARNING, "defrtrlist_del: negative count on %s\n",
> + log(LOG_WARNING, "%s: negative count on %s\n", __func__,
>   dr->ifp->if_xname);
>   }
>  
> @@ -758,14 +757,12 @@ defrouter_select(void)
>   struct nd_defrouter *dr, *selected_dr = NULL, *installed_dr = NULL;
>   struct rtentry *rt = NULL;
>   struct llinfo_nd6 *ln = NULL;
> - int s = splsoftnet();
>  
>   /*
>* Let's handle easy case (3) first:
>* If default router list is empty, there's nothing to be done.
>*/
>   if (TAILQ_EMPTY(_defrouter)) {
> - splx(s);
>   return;
>   }
>  
> @@ -830,9 +827,6 @@ defrouter_select(void)
>   defrouter_delreq(installed_dr);
>   defrouter_addreq(selected_dr);
>   }
> -
> - splx(s);
> - return;
>  }
>  
>  /*
> @@ -1049,14 +1043,14 @@ nd6_prelist_add(struct nd_prefix *pr, st
>  struct nd_prefix **newp)
>  {
>   struct nd_prefix *new = NULL;
> - int i, s;
>   struct in6_ifextra *ext = pr->ndpr_ifp->if_afdata[AF_INET6];
> + int i;
> +
> + splsoftassert(IPL_SOFTNET);
>  
>   if (ip6_maxifprefixes >= 0) {
>   if (ext->nprefixes >= ip6_maxifprefixes / 2) {
> - s = splsoftnet();
>   purge_detached(pr->ndpr_ifp);
> - splx(s);
>   }
>   if (ext->nprefixes >= ip6_maxifprefixes)
>   return(ENOMEM);
> @@ -1079,7 +1073,6 @@ nd6_prelist_add(struct nd_prefix *pr, st
>  
>   task_set(>ndpr_task, nd6_addr_add, new);
>  
> - s = splsoftnet();
>   /* link ndpr_entry to nd_prefix list */
>   LIST_INSERT_HEAD(_prefix, new, ndpr_entry);
>  
> @@ -1089,8 +1082,8 @@ nd6_prelist_add(struct nd_prefix *pr, st
>   int e;
>  
>   if ((e = nd6_prefix_onlink(new)) != 0) {
> - nd6log((LOG_ERR, "nd6_prelist_add: failed to make "
> - "the prefix %s/%d on-link on %s (errno=%d)\n",
> + nd6log((LOG_ERR, "%s: failed to make the prefix %s/%d"
> + " on-link on %s (errno=%d)\n", __func__,
>   inet_ntop(AF_INET6, 

recursive splsoftnet() in ND6

2016-11-28 Thread Martin Pieuchot
This kill multiple recursive splsoftnet(), ok? 

Index: netinet6/nd6.h
===
RCS file: /cvs/src/sys/netinet6/nd6.h,v
retrieving revision 1.64
diff -u -p -r1.64 nd6.h
--- netinet6/nd6.h  21 Nov 2016 10:52:08 -  1.64
+++ netinet6/nd6.h  28 Nov 2016 11:19:49 -
@@ -288,13 +288,10 @@ void nd6_rs_detach(struct ifnet *);
 void nd6_rs_input(struct mbuf *, int, int);
 
 void prelist_del(struct nd_prefix *);
-void defrouter_addreq(struct nd_defrouter *);
 void defrouter_reset(void);
 void defrouter_select(void);
 void defrtrlist_del(struct nd_defrouter *);
 void prelist_remove(struct nd_prefix *);
-int nd6_prelist_add(struct nd_prefix *, struct nd_defrouter *,
-   struct nd_prefix **);
 void pfxlist_onlink_check(void);
 struct nd_defrouter *defrouter_lookup(struct in6_addr *, unsigned int);
 
Index: netinet6/nd6_rtr.c
===
RCS file: /cvs/src/sys/netinet6/nd6_rtr.c,v
retrieving revision 1.151
diff -u -p -r1.151 nd6_rtr.c
--- netinet6/nd6_rtr.c  21 Nov 2016 10:56:26 -  1.151
+++ netinet6/nd6_rtr.c  28 Nov 2016 11:25:24 -
@@ -70,6 +70,9 @@ int nd6_prefix_onlink(struct nd_prefix *
 int nd6_prefix_offlink(struct nd_prefix *);
 void in6_init_address_ltimes(struct nd_prefix *, struct in6_addrlifetime *);
 int prelist_update(struct nd_prefix *, struct nd_defrouter *, struct mbuf *);
+int nd6_prelist_add(struct nd_prefix *, struct nd_defrouter *,
+   struct nd_prefix **);
+void defrouter_addreq(struct nd_defrouter *);
 int rt6_deleteroute(struct rtentry *, void *, unsigned int);
 
 void nd6_addr_add(void *);
@@ -578,7 +581,6 @@ defrouter_addreq(struct nd_defrouter *ne
struct rt_addrinfo info;
struct sockaddr_in6 def, mask, gate;
struct rtentry *rt;
-   int s;
int error;
 
memset(, 0, sizeof(def));
@@ -597,7 +599,6 @@ defrouter_addreq(struct nd_defrouter *ne
info.rti_info[RTAX_GATEWAY] = sin6tosa();
info.rti_info[RTAX_NETMASK] = sin6tosa();
 
-   s = splsoftnet();
error = rtrequest(RTM_ADD, , RTP_DEFAULT, ,
new->ifp->if_rdomain);
if (error == 0) {
@@ -605,8 +606,6 @@ defrouter_addreq(struct nd_defrouter *ne
rtfree(rt);
new->installed = 1;
}
-   splx(s);
-   return;
 }
 
 struct nd_defrouter *
@@ -663,7 +662,7 @@ defrtrlist_del(struct nd_defrouter *dr)
 
ext->ndefrouters--;
if (ext->ndefrouters < 0) {
-   log(LOG_WARNING, "defrtrlist_del: negative count on %s\n",
+   log(LOG_WARNING, "%s: negative count on %s\n", __func__,
dr->ifp->if_xname);
}
 
@@ -758,14 +757,12 @@ defrouter_select(void)
struct nd_defrouter *dr, *selected_dr = NULL, *installed_dr = NULL;
struct rtentry *rt = NULL;
struct llinfo_nd6 *ln = NULL;
-   int s = splsoftnet();
 
/*
 * Let's handle easy case (3) first:
 * If default router list is empty, there's nothing to be done.
 */
if (TAILQ_EMPTY(_defrouter)) {
-   splx(s);
return;
}
 
@@ -830,9 +827,6 @@ defrouter_select(void)
defrouter_delreq(installed_dr);
defrouter_addreq(selected_dr);
}
-
-   splx(s);
-   return;
 }
 
 /*
@@ -1049,14 +1043,14 @@ nd6_prelist_add(struct nd_prefix *pr, st
 struct nd_prefix **newp)
 {
struct nd_prefix *new = NULL;
-   int i, s;
struct in6_ifextra *ext = pr->ndpr_ifp->if_afdata[AF_INET6];
+   int i;
+
+   splsoftassert(IPL_SOFTNET);
 
if (ip6_maxifprefixes >= 0) {
if (ext->nprefixes >= ip6_maxifprefixes / 2) {
-   s = splsoftnet();
purge_detached(pr->ndpr_ifp);
-   splx(s);
}
if (ext->nprefixes >= ip6_maxifprefixes)
return(ENOMEM);
@@ -1079,7 +1073,6 @@ nd6_prelist_add(struct nd_prefix *pr, st
 
task_set(>ndpr_task, nd6_addr_add, new);
 
-   s = splsoftnet();
/* link ndpr_entry to nd_prefix list */
LIST_INSERT_HEAD(_prefix, new, ndpr_entry);
 
@@ -1089,8 +1082,8 @@ nd6_prelist_add(struct nd_prefix *pr, st
int e;
 
if ((e = nd6_prefix_onlink(new)) != 0) {
-   nd6log((LOG_ERR, "nd6_prelist_add: failed to make "
-   "the prefix %s/%d on-link on %s (errno=%d)\n",
+   nd6log((LOG_ERR, "%s: failed to make the prefix %s/%d"
+   " on-link on %s (errno=%d)\n", __func__,
inet_ntop(AF_INET6, >ndpr_prefix.sin6_addr,
addr, sizeof(addr)),
pr->ndpr_plen, pr->ndpr_ifp->if_xname, e));
@@ -1100,7 +1093,6 @@ nd6_prelist_add(struct nd_prefix *pr, st
 
if (dr)