Now that suser() is no longer messing with a per-process field, we
can directly turn setrtable(2) as NOLOCK.
Apart from sanity checks this syscall writes an int-sized per-process
field. Is a memory barrier enough?
ok?
Index: kern/syscalls.master
===================================================================
RCS file: /cvs/src/sys/kern/syscalls.master,v
retrieving revision 1.180
diff -u -p -r1.180 syscalls.master
--- kern/syscalls.master 12 Dec 2017 01:12:34 -0000 1.180
+++ kern/syscalls.master 19 Feb 2018 15:05:34 -0000
@@ -532,7 +532,7 @@
307 OBSOL statfs53
308 OBSOL fstatfs53
309 OBSOL fhstatfs53
-310 STD { int sys_setrtable(int rtableid); }
+310 STD NOLOCK { int sys_setrtable(int rtableid); }
311 STD NOLOCK { int sys_getrtable(void); }
312 OBSOL t32_getdirentries
313 STD { int sys_faccessat(int fd, const char *path, \
Index: kern/uipc_syscalls.c
===================================================================
RCS file: /cvs/src/sys/kern/uipc_syscalls.c,v
retrieving revision 1.165
diff -u -p -r1.165 uipc_syscalls.c
--- kern/uipc_syscalls.c 19 Feb 2018 08:59:52 -0000 1.165
+++ kern/uipc_syscalls.c 19 Feb 2018 15:19:35 -0000
@@ -1189,6 +1190,9 @@ sys_setrtable(struct proc *p, void *v, r
return (EINVAL);
p->p_p->ps_rtableid = (u_int)rtableid;
+ /* Force visibility */
+ membar_producer();
+
return (0);
}