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


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)

Reply via email to