diff options
Diffstat (limited to 'vendor/modernc.org/memory')
| -rw-r--r-- | vendor/modernc.org/memory/memory.go | 6 | ||||
| -rw-r--r-- | vendor/modernc.org/memory/mmap_unix.go | 18 |
2 files changed, 18 insertions, 6 deletions
diff --git a/vendor/modernc.org/memory/memory.go b/vendor/modernc.org/memory/memory.go index e25acda9b..6593c4234 100644 --- a/vendor/modernc.org/memory/memory.go +++ b/vendor/modernc.org/memory/memory.go @@ -109,6 +109,12 @@ func (a *Allocator) mmap(size int) (uintptr /* *page */, error) { return 0, err } + //TODO(jnml) The returned size may now be nearly as twice as large as we asked + //for. Use that extra capacity. For that we need to move the respective + //Allocator.cap item into the page struct so the page cap becomes dynamic. + // + // Related: This is a consequence of fixing the bigsort.test failures on + // linux/s390x, see: https://gitlab.com/cznic/sqlite/-/issues/207 if counters { a.Mmaps++ a.Bytes += size diff --git a/vendor/modernc.org/memory/mmap_unix.go b/vendor/modernc.org/memory/mmap_unix.go index ef6c9a539..8ee991538 100644 --- a/vendor/modernc.org/memory/mmap_unix.go +++ b/vendor/modernc.org/memory/mmap_unix.go @@ -14,7 +14,7 @@ import ( "unsafe" ) -const pageSizeLog = 20 +const pageSizeLog = 16 var ( osPageMask = osPageSize - 1 @@ -28,21 +28,23 @@ func unmap(addr uintptr, size int) error { // pageSize aligned. func mmap(size int) (uintptr, int, error) { size = roundup(size, osPageSize) - up, err := unix.MmapPtr(-1, 0, nil, uintptr(size+pageSize), unix.PROT_READ|unix.PROT_WRITE, unix.MAP_PRIVATE|unix.MAP_ANON) + // Ask for more so we can align the result at a pageSize boundary + n := size + pageSize + up, err := unix.MmapPtr(-1, 0, nil, uintptr(n), unix.PROT_READ|unix.PROT_WRITE, unix.MAP_PRIVATE|unix.MAP_ANON) if err != nil { return 0, 0, err } p := uintptr(up) - n := size + pageSize if p&uintptr(osPageMask) != 0 { panic("internal error") } mod := int(p) & pageMask - if mod != 0 { + if mod != 0 { // Return the extra part before pageSize aligned block m := pageSize - mod if err := unmap(p, m); err != nil { + unmap(p, n) // Do not leak the first mmap return 0, 0, err } @@ -54,9 +56,13 @@ func mmap(size int) (uintptr, int, error) { panic("internal error") } - if n-size != 0 { + if n > size { // Return the extra part after pageSize aligned block if err := unmap(p+uintptr(size), n-size); err != nil { - return 0, 0, err + // Do not error when the kernel rejects the extra part after, just return the + // unexpectedly enlarged size. + // + // Fixes the bigsort.test failures on linux/s390x, see: https://gitlab.com/cznic/sqlite/-/issues/207 + size = n } } |
