diff options
Diffstat (limited to 'cmd')
| -rw-r--r-- | cmd/ioworkload/scenario_mmap.go | 28 | ||||
| -rw-r--r-- | cmd/ioworkload/scenarios.go | 1 |
2 files changed, 29 insertions, 0 deletions
diff --git a/cmd/ioworkload/scenario_mmap.go b/cmd/ioworkload/scenario_mmap.go index e7b9f02..0d953d2 100644 --- a/cmd/ioworkload/scenario_mmap.go +++ b/cmd/ioworkload/scenario_mmap.go @@ -7,6 +7,8 @@ import ( "unsafe" ) +const mremapMayMove = 1 + // mmapBasic creates a file-backed shared mapping. // mmap(2) allows closing the fd after mapping without invalidating the mapping. func mmapBasic() error { @@ -108,3 +110,29 @@ func mmapMsyncInvalidFlags() error { } return nil } + +// mmapMremapMunmap remaps an anonymous mapping and unmaps the resized region. +// It is used to validate enter_mremap/enter_munmap tracing and memory-byte +// accounting separation from I/O bytes. +func mmapMremapMunmap() error { + const pageSize = 4096 + + mapped, err := syscall.Mmap(-1, 0, pageSize, syscall.PROT_READ|syscall.PROT_WRITE, syscall.MAP_PRIVATE|syscall.MAP_ANON) + if err != nil { + return fmt.Errorf("mmap: %w", err) + } + + oldAddr := uintptr(unsafe.Pointer(&mapped[0])) + newSize := uintptr(pageSize * 2) + newAddr, _, errno := syscall.Syscall6(syscall.SYS_MREMAP, oldAddr, uintptr(len(mapped)), newSize, mremapMayMove, 0, 0) + if errno != 0 { + _ = syscall.Munmap(mapped) + return fmt.Errorf("mremap: %w", errno) + } + + _, _, errno = syscall.Syscall(syscall.SYS_MUNMAP, newAddr, newSize, 0) + if errno != 0 { + return fmt.Errorf("munmap: %w", errno) + } + return nil +} diff --git a/cmd/ioworkload/scenarios.go b/cmd/ioworkload/scenarios.go index 6a6e40b..8f4eef2 100644 --- a/cmd/ioworkload/scenarios.go +++ b/cmd/ioworkload/scenarios.go @@ -99,6 +99,7 @@ var scenarios = map[string]func() error{ "mmap-basic": mmapBasic, "mmap-msync-sync": mmapMsyncSync, "mmap-msync-invalid-flags": mmapMsyncInvalidFlags, + "mmap-mremap-munmap": mmapMremapMunmap, "copy-file-range-basic": copyFileRangeBasic, "copy-file-range-bad-dst-fd": copyFileRangeBadDstFd, "truncate-basic": truncateBasic, |
