On Mon, Jun 25, 2018 at 01:29:36PM +0200, Martin Pieuchot wrote:
> On 20/06/18(Wed) 13:13, Martin Pieuchot wrote:
> > Diff below unlocks the following syscalls:
> > 
> >   recvmsg(2), recvfrom(2), accept(2), getpeername(2), getsockname(2),
> >   accept4(2), connect(2), bind(2), setsockopt(2), listen(2),
> >   getsockopt(2), shutdown(2)
> > 
> > It doesn't mean that they won't run without the KERNEL_LOCK().  Instead
> > a lock will be picked based on the socket type.  For Unix/pfkey/routing
> > sockets it is still the KERNEL_LOCK().  That means the KERNEL_LOCK()
> > will be taken a bit later in the syscall.  But for TCP/UDP sockets it
> > will grab the NET_LOCK() instead, just like in sendto(2) and sendmsg(2).
> > 
> > Tests & oks welcome!
> 
> Anyone?
> 

Tested on my surface book, no issues seen. Using -current plus this diff.

-ml

> Index: kern/syscalls.master
> ===================================================================
> RCS file: /cvs/src/sys/kern/syscalls.master,v
> retrieving revision 1.182
> diff -u -p -r1.182 syscalls.master
> --- kern/syscalls.master      20 Jun 2018 10:52:49 -0000      1.182
> +++ kern/syscalls.master      20 Jun 2018 11:06:20 -0000
> @@ -88,18 +88,18 @@
>  #else
>  26   UNIMPL          ptrace
>  #endif
> -27   STD             { ssize_t sys_recvmsg(int s, struct msghdr *msg, \
> +27   STD NOLOCK      { ssize_t sys_recvmsg(int s, struct msghdr *msg, \
>                           int flags); }
>  28   STD NOLOCK      { ssize_t sys_sendmsg(int s, \
>                           const struct msghdr *msg, int flags); }
> -29   STD             { ssize_t sys_recvfrom(int s, void *buf, size_t len, \
> +29   STD NOLOCK      { ssize_t sys_recvfrom(int s, void *buf, size_t len, \
>                           int flags, struct sockaddr *from, \
>                           socklen_t *fromlenaddr); }
> -30   STD             { int sys_accept(int s, struct sockaddr *name, \
> +30   STD NOLOCK      { int sys_accept(int s, struct sockaddr *name, \
>                           socklen_t *anamelen); }
> -31   STD             { int sys_getpeername(int fdes, struct sockaddr *asa, \
> +31   STD NOLOCK      { int sys_getpeername(int fdes, struct sockaddr *asa, \
>                           socklen_t *alen); }
> -32   STD             { int sys_getsockname(int fdes, struct sockaddr *asa, \
> +32   STD NOLOCK      { int sys_getsockname(int fdes, struct sockaddr *asa, \
>                           socklen_t *alen); }
>  33   STD             { int sys_access(const char *path, int amode); }
>  34   STD             { int sys_chflags(const char *path, u_int flags); }
> @@ -205,7 +205,7 @@
>  91   STD             { int sys_nanosleep(const struct timespec *rqtp, \
>                           struct timespec *rmtp); }
>  92   STD             { int sys_fcntl(int fd, int cmd, ... void *arg); }
> -93   STD             { int sys_accept4(int s, struct sockaddr *name, \
> +93   STD NOLOCK      { int sys_accept4(int s, struct sockaddr *name, \
>                           socklen_t *anamelen, int flags); }
>  94   STD             { int sys___thrsleep(const volatile void *ident, \
>                           clockid_t clock_id, const struct timespec *tp, \
> @@ -213,18 +213,18 @@
>  95   STD             { int sys_fsync(int fd); }
>  96   STD             { int sys_setpriority(int which, id_t who, int prio); }
>  97   STD NOLOCK      { int sys_socket(int domain, int type, int protocol); }
> -98   STD             { int sys_connect(int s, const struct sockaddr *name, \
> +98   STD NOLOCK      { int sys_connect(int s, const struct sockaddr *name, \
>                           socklen_t namelen); }
>  99   STD             { int sys_getdents(int fd, void *buf, size_t buflen); }
>  100  STD             { int sys_getpriority(int which, id_t who); }
>  101  STD             { int sys_pipe2(int *fdp, int flags); }
>  102  STD             { int sys_dup3(int from, int to, int flags); }
>  103  STD             { int sys_sigreturn(struct sigcontext *sigcntxp); }
> -104  STD             { int sys_bind(int s, const struct sockaddr *name, \
> +104  STD NOLOCK      { int sys_bind(int s, const struct sockaddr *name, \
>                           socklen_t namelen); }
> -105  STD             { int sys_setsockopt(int s, int level, int name, \
> +105  STD NOLOCK      { int sys_setsockopt(int s, int level, int name, \
>                           const void *val, socklen_t valsize); }
> -106  STD             { int sys_listen(int s, int backlog); }
> +106  STD NOLOCK      { int sys_listen(int s, int backlog); }
>  107  STD             { int sys_chflagsat(int fd, const char *path, \
>                           u_int flags, int atflags); }
>  108  STD             { int sys_pledge(const char *promises, \
> @@ -243,7 +243,7 @@
>  115  OBSOL           vtrace
>  116  OBSOL           t32_gettimeofday
>  117  OBSOL           t32_getrusage
> -118  STD             { int sys_getsockopt(int s, int level, int name, \
> +118  STD NOLOCK      { int sys_getsockopt(int s, int level, int name, \
>                           void *val, socklen_t *avalsize); }
>  119  STD             { int sys_thrkill(pid_t tid, int signum, void *tcb); }
>  120  STD             { ssize_t sys_readv(int fd, \
> @@ -264,7 +264,7 @@
>  133  STD NOLOCK      { ssize_t sys_sendto(int s, const void *buf, \
>                           size_t len, int flags, const struct sockaddr *to, \
>                           socklen_t tolen); }
> -134  STD             { int sys_shutdown(int s, int how); }
> +134  STD NOLOCK      { int sys_shutdown(int s, int how); }
>  135  STD NOLOCK      { int sys_socketpair(int domain, int type, \
>                           int protocol, int *rsv); }
>  136  STD             { int sys_mkdir(const char *path, mode_t mode); }
> 

Reply via email to