On 07/02/18(Wed) 16:11, Ted Unangst wrote: > Martin Pieuchot wrote: > > Diff below shuffles sys_socket() to look like sys_socketpair(). > > > > The goal is to do socket operations first in both functions. Since > > they don't need the KERNEL_LOCK(), we will be able to mark the syscalls > > NOLOCK and only grab it before messing with file descriptors. > > this looks ok, but a few comments about future directions. > > > + fdplock(fdp); > > + error = falloc(p, cloexec, &fp, &fd); > > + fdpunlock(fdp); > > > + fp->f_flag = fflag; > > + fp->f_type = DTYPE_SOCKET; > > + fp->f_ops = &socketops; > > if (type & SOCK_NONBLOCK) > > so->so_state |= SS_NBIO; > > so->so_state |= ss; > fp->f_data = so; > FILE_SET_MATURE(fp, p); > > i'm a little concerned about races here. i think we are missing some barriers > to allow the larval flag on files to properly work in a concurrent system. > there's nothing to prevent the compiler from hoisting the flag setting above > the other operations. then another thread in sys_read is going to see bad > stuff. > > maybe we want something like this? (maybe i'm getting ahead of myself?)
You're right but there's much more than that. So in a sense you're getting a bit ahead of yourself, yes ;) Larval flag has been designed with sleep in mind. Now if we want to go parallel there there's much more to do. I'm quite sure we'll trade the KERNEL_LOCK() for another lock first. So such barrier is premature and would be misleading :) > Index: file.h > =================================================================== > RCS file: /cvs/src/sys/sys/file.h,v > retrieving revision 1.39 > diff -u -p -r1.39 file.h > --- file.h 2 Jan 2018 06:40:55 -0000 1.39 > +++ file.h 7 Feb 2018 21:10:57 -0000 > @@ -93,6 +93,7 @@ struct file { > #define FRELE(fp,p) (--(fp)->f_count == 0 ? fdrop(fp, p) : 0) > > #define FILE_SET_MATURE(fp,p) do { \ > + membar_producer(); \ > (fp)->f_iflags &= ~FIF_LARVAL; \ > FRELE(fp, p); \ > } while (0) >