On Tue, Nov 22, 2016 at 11:39:32AM +0100, Martin Pieuchot wrote: > On 21/11/16(Mon) 20:07, Alexander Bluhm wrote: > > [...] > > NFS hits you again. nfs_boot_init() calls ifioctl(). Perhaps put > > the splsoftnet() inside ifioctl(). > > I'll put it inside nfs_boot() because the function also iterate on > structures that need to be protected. Note that this should not matter > during boot, but we might have to play tricks if we put too many > asserts.
OK bluhm@ > > Index: kern/sys_socket.c > =================================================================== > RCS file: /cvs/src/sys/kern/sys_socket.c,v > retrieving revision 1.24 > diff -u -p -r1.24 sys_socket.c > --- kern/sys_socket.c 21 Nov 2016 10:30:42 -0000 1.24 > +++ kern/sys_socket.c 22 Nov 2016 10:30:18 -0000 > @@ -119,8 +119,12 @@ soo_ioctl(struct file *fp, u_long cmd, c > * interface and routing ioctls should have a > * different entry since a socket's unnecessary > */ > - if (IOCGROUP(cmd) == 'i') > - return (ifioctl(so, cmd, data, p)); > + if (IOCGROUP(cmd) == 'i') { > + s = splsoftnet(); > + error = ifioctl(so, cmd, data, p); > + splx(s); > + return (error); > + } > if (IOCGROUP(cmd) == 'r') > return (EOPNOTSUPP); > s = splsoftnet(); > Index: nfs/nfs_boot.c > =================================================================== > RCS file: /cvs/src/sys/nfs/nfs_boot.c,v > retrieving revision 1.39 > diff -u -p -r1.39 nfs_boot.c > --- nfs/nfs_boot.c 1 Sep 2015 21:24:04 -0000 1.39 > +++ nfs/nfs_boot.c 22 Nov 2016 10:36:36 -0000 > @@ -122,7 +122,7 @@ nfs_boot_init(struct nfs_diskless *nd, s > struct socket *so; > struct ifaddr *ifa; > char addr[INET_ADDRSTRLEN]; > - int error; > + int s, error; > > /* > * Find an interface, rarp for its ip address, stuff it, the > @@ -159,11 +159,15 @@ nfs_boot_init(struct nfs_diskless *nd, s > */ > if ((error = socreate(AF_INET, &so, SOCK_DGRAM, 0)) != 0) > panic("nfs_boot: socreate, error=%d", error); > + s = splsoftnet(); > error = ifioctl(so, SIOCGIFFLAGS, (caddr_t)&ireq, procp); > + splx(s); > if (error) > panic("nfs_boot: GIFFLAGS, error=%d", error); > ireq.ifr_flags |= IFF_UP; > + s = splsoftnet(); > error = ifioctl(so, SIOCSIFFLAGS, (caddr_t)&ireq, procp); > + splx(s); > if (error) > panic("nfs_boot: SIFFLAGS, error=%d", error); > > @@ -186,7 +190,9 @@ nfs_boot_init(struct nfs_diskless *nd, s > sin->sin_len = sizeof(*sin); > sin->sin_family = AF_INET; > sin->sin_addr.s_addr = my_ip.s_addr; > + s = splsoftnet(); > error = ifioctl(so, SIOCAIFADDR, (caddr_t)&ifra, procp); > + splx(s); > if (error) > panic("nfs_boot: set if addr, error=%d", error); >