On Thu, Feb 19, 2015 at 09:30:40PM +0100, Alexander Bluhm wrote: > On Wed, Feb 18, 2015 at 12:14:15PM +0100, Matthieu Herrb wrote: > > Feb 18 12:09:59 castor /bsd: splassert: rtrequest1: want 5 have 0 > > Feb 18 12:09:59 castor /bsd: Starting stack trace... > > Feb 18 12:09:59 castor /bsd: splassert_check() at splassert_check+0x78 > > Feb 18 12:09:59 castor /bsd: rtrequest1() at rtrequest1+0x5e > > Feb 18 12:09:59 castor /bsd: nd6_prefix_offlink() at > > nd6_prefix_offlink+0x1bf > > Feb 18 12:09:59 castor /bsd: pfxlist_onlink_check() at > > pfxlist_onlink_check+0x25e > > Feb 18 12:09:59 castor /bsd: in6_control() at in6_control+0x894 > > Feb 18 12:09:59 castor /bsd: ifioctl() at ifioctl+0x175 > > Feb 18 12:09:59 castor /bsd: sys_ioctl() at sys_ioctl+0x169 > > Feb 18 12:09:59 castor /bsd: syscall() at syscall+0x297 > > Feb 18 12:09:59 castor /bsd: --- syscall (number 54) --- > > Feb 18 12:09:59 castor /bsd: end of kernel > > Feb 18 12:09:59 castor /bsd: end trace frame: 0xc8115948400, count: > > 249 > > Feb 18 12:09:59 castor /bsd: 0xc8115715cda: > > Feb 18 12:09:59 castor /bsd: End of stack trace. > > Feb 18 12:10:00 castor /bsd: carp0: state transition: BACKUP -> MASTER > > Most calls to pfxlist_onlink_check() are protected by splsoftnet. > Only the path in your trace does not set it. So I suggest to set > splsoftnet() in in6_control(). I have included the dohooks() as > this is done in IPv4. While there I have moved some splsoftnet() > hiding in the declarations to the beginning of the code. > > ok?
This fixes the issue (which was reproducible) for me. so ok as far as I understand the issue. > > bluhm > > Index: netinet6/in6.c > =================================================================== > RCS file: /data/mirror/openbsd/cvs/src/sys/netinet6/in6.c,v > retrieving revision 1.152 > diff -u -p -r1.152 in6.c > --- netinet6/in6.c 27 Jan 2015 10:34:27 -0000 1.152 > +++ netinet6/in6.c 19 Feb 2015 18:47:06 -0000 > @@ -552,6 +552,7 @@ in6_control(struct socket *so, u_long cm > pr->ndpr_refcnt++; > } > > + s = splsoftnet(); > /* > * this might affect the status of autoconfigured addresses, > * that is, this address might make other addresses detached. > @@ -559,6 +560,7 @@ in6_control(struct socket *so, u_long cm > pfxlist_onlink_check(); > > dohooks(ifp->if_addrhooks, 0); > + splx(s); > break; > } > > Index: netinet6/nd6_rtr.c > =================================================================== > RCS file: /data/mirror/openbsd/cvs/src/sys/netinet6/nd6_rtr.c,v > retrieving revision 1.97 > diff -u -p -r1.97 nd6_rtr.c > --- netinet6/nd6_rtr.c 27 Jan 2015 03:17:36 -0000 1.97 > +++ netinet6/nd6_rtr.c 19 Feb 2015 17:39:18 -0000 > @@ -707,10 +707,10 @@ defrouter_reset(void) > void > defrouter_select(void) > { > - int s = splsoftnet(); > struct nd_defrouter *dr, *selected_dr = NULL, *installed_dr = NULL; > struct rtentry *rt = NULL; > struct llinfo_nd6 *ln = NULL; > + int s = splsoftnet(); > > /* > * This function should be called only when acting as an autoconfigured > @@ -1139,12 +1139,13 @@ prelist_update(struct nd_prefix *new, st > struct ifaddr *ifa; > struct ifnet *ifp = new->ndpr_ifp; > struct nd_prefix *pr; > - int s = splsoftnet(); > - int error = 0; > + int s, error = 0; > int tempaddr_preferred = 0, autoconf = 0, statique = 0; > int auth; > struct in6_addrlifetime lt6_tmp; > char addr[INET6_ADDRSTRLEN]; > + > + s = splsoftnet(); > > auth = 0; > if (m) { > -- Matthieu Herrb