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)
>