1
0
mirror of https://github.com/golang/go synced 2024-11-12 09:30:25 -07:00

internal/cpu: add a CacheLinePadSize constant

The new constant CacheLinePadSize can be used to compute best effort
alignment of structs to cache lines.

e.g. the runtime can use this in the locktab definition:
var locktab [57]struct {
        l   spinlock
        pad [cpu.CacheLinePadSize - unsafe.Sizeof(spinlock{})]byte
}

Change-Id: I86f6fbfc5ee7436f742776a7d4a99a1d54ffccc8
Reviewed-on: https://go-review.googlesource.com/131237
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
Martin Möhrmann 2018-08-24 17:07:20 +02:00
parent 38143badf1
commit 60f83621fc
11 changed files with 16 additions and 11 deletions

View File

@ -12,7 +12,12 @@ package cpu
var DebugOptions bool var DebugOptions bool
// CacheLinePad is used to pad structs to avoid false sharing. // CacheLinePad is used to pad structs to avoid false sharing.
type CacheLinePad struct{ _ [CacheLineSize]byte } type CacheLinePad struct{ _ [CacheLinePadSize]byte }
// CacheLineSize is the CPU's assumed cache line size.
// There is currently no runtime detection of the real cache line size
// so we use the constant per GOARCH CacheLinePadSize as an approximation.
var CacheLineSize = CacheLinePadSize
var X86 x86 var X86 x86

View File

@ -4,7 +4,7 @@
package cpu package cpu
const CacheLineSize = 32 const CacheLinePadSize = 32
// arm doesn't have a 'cpuid' equivalent, so we rely on HWCAP/HWCAP2. // arm doesn't have a 'cpuid' equivalent, so we rely on HWCAP/HWCAP2.
// These are linknamed in runtime/os_(linux|freebsd)_arm.go and are // These are linknamed in runtime/os_(linux|freebsd)_arm.go and are

View File

@ -4,7 +4,7 @@
package cpu package cpu
const CacheLineSize = 64 const CacheLinePadSize = 64
// arm64 doesn't have a 'cpuid' equivalent, so we rely on HWCAP/HWCAP2. // arm64 doesn't have a 'cpuid' equivalent, so we rely on HWCAP/HWCAP2.
// These are initialized by archauxv in runtime/os_linux_arm64.go. // These are initialized by archauxv in runtime/os_linux_arm64.go.

View File

@ -4,4 +4,4 @@
package cpu package cpu
const CacheLineSize = 32 const CacheLinePadSize = 32

View File

@ -4,4 +4,4 @@
package cpu package cpu
const CacheLineSize = 32 const CacheLinePadSize = 32

View File

@ -4,4 +4,4 @@
package cpu package cpu
const CacheLineSize = 32 const CacheLinePadSize = 32

View File

@ -4,4 +4,4 @@
package cpu package cpu
const CacheLineSize = 32 const CacheLinePadSize = 32

View File

@ -6,7 +6,7 @@
package cpu package cpu
const CacheLineSize = 128 const CacheLinePadSize = 128
// ppc64x doesn't have a 'cpuid' equivalent, so we rely on HWCAP/HWCAP2. // ppc64x doesn't have a 'cpuid' equivalent, so we rely on HWCAP/HWCAP2.
// These are initialized by archauxv in runtime/os_linux_ppc64x.go. // These are initialized by archauxv in runtime/os_linux_ppc64x.go.

View File

@ -4,7 +4,7 @@
package cpu package cpu
const CacheLineSize = 256 const CacheLinePadSize = 256
// bitIsSet reports whether the bit at index is set. The bit index // bitIsSet reports whether the bit at index is set. The bit index
// is in big endian order, so bit index 0 is the leftmost bit. // is in big endian order, so bit index 0 is the leftmost bit.

View File

@ -4,4 +4,4 @@
package cpu package cpu
const CacheLineSize = 64 const CacheLinePadSize = 64

View File

@ -6,7 +6,7 @@
package cpu package cpu
const CacheLineSize = 64 const CacheLinePadSize = 64
// cpuid is implemented in cpu_x86.s. // cpuid is implemented in cpu_x86.s.
func cpuid(eaxArg, ecxArg uint32) (eax, ebx, ecx, edx uint32) func cpuid(eaxArg, ecxArg uint32) (eax, ebx, ecx, edx uint32)