mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
On Linux, both mprotect() and mmap() acquire the mmap_lock (in writer mode),
posing scalability challenges.
The mmap_lock (formerly called mmap_sem) is a reader/writer lock that controls
access to a process's address space; before making changes there (mapping in a
new range, for example), the kernel must acquire that lock.
Page-fault handling must also acquire mmap_lock (in reader mode) to ensure that
the address space doesn't change in surprising ways while a fault is being resolved.
A process can have a large address space and many threads running (and incurring
page faults) concurrently, turning mmap_lock into a significant bottleneck.
While both mmap() and mprotect() are protected by the mmap_lock, the shorter
duration of mprotect system call, due to their simpler nature, results in a reduced
locking time for the mmap_lock.
Change-Id: I7f929544904e31eab34d0d8a9e368abe4de64637
GitHub-Last-Rev: 6f27a216b4
GitHub-Pull-Request: golang/go#65038
Reviewed-on: https://go-review.googlesource.com/c/go/+/554935
Reviewed-by: Michael Knyszek <mknyszek@google.com>
Reviewed-by: Mauri de Souza Meneguzzo <mauri870@gmail.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
23 lines
472 B
Go
23 lines
472 B
Go
// Copyright 2022 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package syscall
|
|
|
|
const (
|
|
SYS_EPOLL_CREATE1 = 20
|
|
SYS_EPOLL_CTL = 21
|
|
SYS_EPOLL_PWAIT = 22
|
|
SYS_FCNTL = 25
|
|
SYS_MPROTECT = 226
|
|
SYS_EPOLL_PWAIT2 = 441
|
|
SYS_EVENTFD2 = 19
|
|
|
|
EFD_NONBLOCK = 0x800
|
|
)
|
|
|
|
type EpollEvent struct {
|
|
Events uint32
|
|
_pad uint32
|
|
Data [8]byte // to match amd64
|
|
}
|