Mark mmap(2), munmap(2) and mprotect(2) as NOLOCK.
authormpi <mpi@openbsd.org>
Tue, 8 Nov 2022 11:05:57 +0000 (11:05 +0000)
committermpi <mpi@openbsd.org>
Tue, 8 Nov 2022 11:05:57 +0000 (11:05 +0000)
Accesses to data structures used by these syscalls are serialized by the
VM map lock with the exception of file mappings which are still protected
by the KERNEL_LOCK().

Unlocking this set of syscalls improves most of userland workloads.

Tested by many including robert@ (since 2 years), mlarkin@, kn@, sdk@,
jca@, aoyama@, naddy@, Scott Bennett and others. Thanks to all!

Joint work with kn@.

ok robert@, aja@, kettenis@, kn@, deraadt@, beck@

sys/kern/syscalls.master

index 5b5cbbe..59f4a97 100644 (file)
@@ -1,4 +1,4 @@
-;      $OpenBSD: syscalls.master,v 1.234 2022/10/25 16:10:31 kettenis Exp $
+;      $OpenBSD: syscalls.master,v 1.235 2022/11/08 11:05:57 mpi Exp $
 ;      $NetBSD: syscalls.master,v 1.32 1996/04/23 10:24:21 mycroft Exp $
 
 ;      @(#)syscalls.master     8.2 (Berkeley) 1/13/94
                            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
                            const struct kevent *changelist, int nchanges, \
                            struct kevent *eventlist, int nevents, \
                            const struct timespec *timeout); }
-73     STD             { int sys_munmap(void *addr, size_t len); }
-74     STD             { int sys_mprotect(void *addr, size_t len, \
+73     STD NOLOCK      { int sys_munmap(void *addr, size_t len); }
+74     STD NOLOCK      { int sys_mprotect(void *addr, size_t len, \
                            int prot); }
 75     STD             { int sys_madvise(void *addr, size_t len, \
                            int behav); }