Skip to content

Commit

Permalink
runtime: don't hard-code physical page size
Browse files Browse the repository at this point in the history
Now that the runtime fetches the true physical page size from the OS,
make the physical page size used by heap growth a variable instead of
a constant. This isn't used in any performance-critical paths, so it
shouldn't be an issue.

sys.PhysPageSize is also renamed to sys.DefaultPhysPageSize to make it
clear that it's not necessarily the true page size. There are no uses
of this constant any more, but we'll keep it around for now.

Updates golang#12480 and golang#10180.

Change-Id: I6c23b9df860db309c38c8287a703c53817754f03
Reviewed-on: https://go-review.googlesource.com/25022
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rick Hudson <rlh@golang.org>
  • Loading branch information
aclements authored and tmm1 committed Nov 9, 2016
1 parent 49b61fe commit 4efcf10
Show file tree
Hide file tree
Showing 14 changed files with 96 additions and 99 deletions.
16 changes: 8 additions & 8 deletions src/runtime/internal/sys/arch_386.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@
package sys

const (
ArchFamily = I386
BigEndian = 0
CacheLineSize = 64
PhysPageSize = GoosNacl*65536 + (1-GoosNacl)*4096 // 4k normally; 64k on NaCl
PCQuantum = 1
Int64Align = 4
HugePageSize = 1 << 21
MinFrameSize = 0
ArchFamily = I386
BigEndian = 0
CacheLineSize = 64
DefaultPhysPageSize = GoosNacl*65536 + (1-GoosNacl)*4096 // 4k normally; 64k on NaCl
PCQuantum = 1
Int64Align = 4
HugePageSize = 1 << 21
MinFrameSize = 0
)

type Uintreg uint32
16 changes: 8 additions & 8 deletions src/runtime/internal/sys/arch_amd64.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@
package sys

const (
ArchFamily = AMD64
BigEndian = 0
CacheLineSize = 64
PhysPageSize = 4096
PCQuantum = 1
Int64Align = 8
HugePageSize = 1 << 21
MinFrameSize = 0
ArchFamily = AMD64
BigEndian = 0
CacheLineSize = 64
DefaultPhysPageSize = 4096
PCQuantum = 1
Int64Align = 8
HugePageSize = 1 << 21
MinFrameSize = 0
)

type Uintreg uint64
16 changes: 8 additions & 8 deletions src/runtime/internal/sys/arch_amd64p32.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@
package sys

const (
ArchFamily = AMD64
BigEndian = 0
CacheLineSize = 64
PhysPageSize = 65536*GoosNacl + 4096*(1-GoosNacl)
PCQuantum = 1
Int64Align = 8
HugePageSize = 1 << 21
MinFrameSize = 0
ArchFamily = AMD64
BigEndian = 0
CacheLineSize = 64
DefaultPhysPageSize = 65536*GoosNacl + 4096*(1-GoosNacl)
PCQuantum = 1
Int64Align = 8
HugePageSize = 1 << 21
MinFrameSize = 0
)

type Uintreg uint64
16 changes: 8 additions & 8 deletions src/runtime/internal/sys/arch_arm.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@
package sys

const (
ArchFamily = ARM
BigEndian = 0
CacheLineSize = 32
PhysPageSize = 65536
PCQuantum = 4
Int64Align = 4
HugePageSize = 0
MinFrameSize = 4
ArchFamily = ARM
BigEndian = 0
CacheLineSize = 32
DefaultPhysPageSize = 65536
PCQuantum = 4
Int64Align = 4
HugePageSize = 0
MinFrameSize = 4
)

type Uintreg uint32
16 changes: 8 additions & 8 deletions src/runtime/internal/sys/arch_arm64.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@
package sys

const (
ArchFamily = ARM64
BigEndian = 0
CacheLineSize = 32
PhysPageSize = 65536
PCQuantum = 4
Int64Align = 8
HugePageSize = 0
MinFrameSize = 8
ArchFamily = ARM64
BigEndian = 0
CacheLineSize = 32
DefaultPhysPageSize = 65536
PCQuantum = 4
Int64Align = 8
HugePageSize = 0
MinFrameSize = 8
)

type Uintreg uint64
16 changes: 8 additions & 8 deletions src/runtime/internal/sys/arch_mips64.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@
package sys

const (
ArchFamily = MIPS64
BigEndian = 1
CacheLineSize = 32
PhysPageSize = 16384
PCQuantum = 4
Int64Align = 8
HugePageSize = 0
MinFrameSize = 8
ArchFamily = MIPS64
BigEndian = 1
CacheLineSize = 32
DefaultPhysPageSize = 16384
PCQuantum = 4
Int64Align = 8
HugePageSize = 0
MinFrameSize = 8
)

type Uintreg uint64
16 changes: 8 additions & 8 deletions src/runtime/internal/sys/arch_mips64le.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@
package sys

const (
ArchFamily = MIPS64
BigEndian = 0
CacheLineSize = 32
PhysPageSize = 16384
PCQuantum = 4
Int64Align = 8
HugePageSize = 0
MinFrameSize = 8
ArchFamily = MIPS64
BigEndian = 0
CacheLineSize = 32
DefaultPhysPageSize = 16384
PCQuantum = 4
Int64Align = 8
HugePageSize = 0
MinFrameSize = 8
)

type Uintreg uint64
16 changes: 8 additions & 8 deletions src/runtime/internal/sys/arch_ppc64.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@
package sys

const (
ArchFamily = PPC64
BigEndian = 1
CacheLineSize = 128
PhysPageSize = 65536
PCQuantum = 4
Int64Align = 8
HugePageSize = 0
MinFrameSize = 32
ArchFamily = PPC64
BigEndian = 1
CacheLineSize = 128
DefaultPhysPageSize = 65536
PCQuantum = 4
Int64Align = 8
HugePageSize = 0
MinFrameSize = 32
)

type Uintreg uint64
16 changes: 8 additions & 8 deletions src/runtime/internal/sys/arch_ppc64le.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@
package sys

const (
ArchFamily = PPC64
BigEndian = 0
CacheLineSize = 128
PhysPageSize = 65536
PCQuantum = 4
Int64Align = 8
HugePageSize = 0
MinFrameSize = 32
ArchFamily = PPC64
BigEndian = 0
CacheLineSize = 128
DefaultPhysPageSize = 65536
PCQuantum = 4
Int64Align = 8
HugePageSize = 0
MinFrameSize = 32
)

type Uintreg uint64
16 changes: 8 additions & 8 deletions src/runtime/internal/sys/arch_s390x.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@
package sys

const (
ArchFamily = S390X
BigEndian = 1
CacheLineSize = 256
PhysPageSize = 4096
PCQuantum = 2
Int64Align = 8
HugePageSize = 0
MinFrameSize = 8
ArchFamily = S390X
BigEndian = 1
CacheLineSize = 256
DefaultPhysPageSize = 4096
PCQuantum = 2
Int64Align = 8
HugePageSize = 0
MinFrameSize = 8
)

type Uintreg uint64
12 changes: 6 additions & 6 deletions src/runtime/malloc.go
Original file line number Diff line number Diff line change
Expand Up @@ -230,13 +230,13 @@ func mallocinit() {
// The OS init code failed to fetch the physical page size.
throw("failed to get system page size")
}
if sys.PhysPageSize < physPageSize {
print("runtime: kernel page size (", physPageSize, ") is larger than runtime page size (", sys.PhysPageSize, ")\n")
throw("bad kernel page size")
if physPageSize < minPhysPageSize {
print("system page size (", physPageSize, ") is smaller than minimum page size (", minPhysPageSize, ")\n")
throw("bad system page size")
}
if sys.PhysPageSize%physPageSize != 0 {
print("runtime: runtime page size (", sys.PhysPageSize, ") is not a multiple of kernel page size (", physPageSize, ")\n")
throw("bad kernel page size")
if physPageSize&(physPageSize-1) != 0 {
print("system page size (", physPageSize, ") must be a power of 2\n")
throw("bad system page size")
}

var p, bitmapSize, spansSize, pSize, limit uintptr
Expand Down
2 changes: 1 addition & 1 deletion src/runtime/mbitmap.go
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ func (h *mheap) mapBits(arena_used uintptr) {

n := (arena_used - mheap_.arena_start) / heapBitmapScale
n = round(n, bitmapChunk)
n = round(n, sys.PhysPageSize)
n = round(n, physPageSize)
if h.bitmap_mapped >= n {
return
}
Expand Down
9 changes: 3 additions & 6 deletions src/runtime/mem_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,17 +22,14 @@ const (
var addrspace_vec [1]byte

func addrspace_free(v unsafe.Pointer, n uintptr) bool {
// Step by the minimum possible physical page size. This is
// safe even if we have the wrong physical page size; mincore
// will just return EINVAL for unaligned addresses.
for off := uintptr(0); off < n; off += minPhysPageSize {
for off := uintptr(0); off < n; off += physPageSize {
// Use a length of 1 byte, which the kernel will round
// up to one physical page regardless of the true
// physical page size.
errval := mincore(unsafe.Pointer(uintptr(v)+off), 1, &addrspace_vec[0])
if errval == -_EINVAL {
// Address is not a multiple of the physical
// page size. That's fine.
// page size. Shouldn't happen, but just ignore it.
continue
}
// ENOMEM means unmapped, which is what we want.
Expand Down Expand Up @@ -138,7 +135,7 @@ func sysUnused(v unsafe.Pointer, n uintptr) {
}
}

if uintptr(v)&(sys.PhysPageSize-1) != 0 || n&(sys.PhysPageSize-1) != 0 {
if uintptr(v)&(physPageSize-1) != 0 || n&(physPageSize-1) != 0 {
// madvise will round this to any physical page
// *covered* by this range, so an unaligned madvise
// will release more memory than intended.
Expand Down
12 changes: 6 additions & 6 deletions src/runtime/mheap.go
Original file line number Diff line number Diff line change
Expand Up @@ -401,7 +401,7 @@ func (h *mheap) mapSpans(arena_used uintptr) {
n := arena_used
n -= h.arena_start
n = n / _PageSize * sys.PtrSize
n = round(n, sys.PhysPageSize)
n = round(n, physPageSize)
if h.spans_mapped >= n {
return
}
Expand Down Expand Up @@ -909,14 +909,14 @@ func scavengelist(list *mSpanList, now, limit uint64) uintptr {
if (now-uint64(s.unusedsince)) > limit && s.npreleased != s.npages {
start := s.base()
end := start + s.npages<<_PageShift
if sys.PhysPageSize > _PageSize {
if physPageSize > _PageSize {
// We can only release pages in
// PhysPageSize blocks, so round start
// physPageSize blocks, so round start
// and end in. (Otherwise, madvise
// will round them *out* and release
// more memory than we want.)
start = (start + sys.PhysPageSize - 1) &^ (sys.PhysPageSize - 1)
end &^= sys.PhysPageSize - 1
start = (start + physPageSize - 1) &^ (physPageSize - 1)
end &^= physPageSize - 1
if end <= start {
// start and end don't span a
// whole physical page.
Expand All @@ -926,7 +926,7 @@ func scavengelist(list *mSpanList, now, limit uint64) uintptr {
len := end - start

released := len - (s.npreleased << _PageShift)
if sys.PhysPageSize > _PageSize && released == 0 {
if physPageSize > _PageSize && released == 0 {
continue
}
memstats.heap_released += uint64(released)
Expand Down

0 comments on commit 4efcf10

Please sign in to comment.