Mike Larkin(mlar...@azathoth.net) on 2018.06.25 19:31:40 -0700: > 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.
same here, fine in the past two days. machine runs relayd, bgpd etc... > -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); > > } > > >