On Fri, Dec 31, 2021 at 07:54:53PM +0300, Vitaliy Makkoveev wrote: > The uvm_wxabort path within uvm_wxcheck() looks not MP-safe.
Right, I did not pay enough attention to W^X handling. I'm not entirely sure about the sigexit() path. There's `ps_wxcounter' as u_int64_t which needs a lock or atomic operations. The kernel lock could be pushed into uvm_wxabort() but there it'd still be grabbed for every mmap(2) call. > > > On 31 Dec 2021, at 12:14, Klemens Nanni <k...@openbsd.org> wrote: > > > > Now that mpi has unlocked uvm's fault handler, we can unlock the mmap > > syscall to handle MAP_ANON without the big lock. > > > > sys_mmap() still protects the !MAP_ANON case, i.e. file based mappings, > > with the KERNEL_LOCK() itself, which is why unlocking the syscall will > > only change locking behaviour for anonymous mappings. > > > > A previous to unlock file based mappings was reverted, see the following > > from https://marc.info/?l=openbsd-tech&m=160155434212888&w=2 : > > > > commit 38802bc07455f2a4f8cdde272850a5eab5dfa6c8 > > from: mpi <m...@openbsd.org> > > date: Wed Oct 7 12:26:20 2020 UTC > > > > Do not release the KERNEL_LOCK() when mmap(2)ing files. > > > > Previous attempt to unlock amap & anon exposed a race in vnode reference > > counting. So be conservative with the code paths that we're not fully > > moving > > out of the KERNEL_LOCK() to allow us to concentrate on one area at a > > time. > > ... > > > > > > So here's a first small step. I've been running with this for months > > on a few amd64, arm64 and sparc64 boxes without problems; they've been > > daily drivers and/or have been building releases and ports. > > > > Feedback? Objections? OK? > > > > > > Index: sys/kern/syscalls.master > > =================================================================== > > RCS file: /cvs/src/sys/kern/syscalls.master,v > > retrieving revision 1.221 > > diff -u -p -r1.221 syscalls.master > > --- sys/kern/syscalls.master 23 Dec 2021 18:50:31 -0000 1.221 > > +++ sys/kern/syscalls.master 31 Dec 2021 09:14:00 -0000 > > @@ -126,7 +126,7 @@ > > struct sigaction *osa); } > > 47 STD NOLOCK { gid_t sys_getgid(void); } > > 48 STD NOLOCK { int sys_sigprocmask(int how, sigset_t mask); } > > -49 STD { void *sys_mmap(void *addr, size_t len, int prot, \ > > +49 STD NOLOCK { void *sys_mmap(void *addr, size_t len, int prot, \ > > int flags, int fd, off_t pos); } > > 50 STD { int sys_setlogin(const char *namebuf); } > > #ifdef ACCOUNTING > > >