mirror of https://github.com/golang/go.git
runtime: handle m0 padding better
The SpinbitMutex experiment requires m structs other than m0 to be allocated in 2048-byte size class, by adding padding. Do the calculation more explicitly, to avoid future CLs like CL 653335. Change-Id: I83ae1e86ef3711ab65441f4e487f94b9e1429029 Reviewed-on: https://go-review.googlesource.com/c/go/+/654595 Reviewed-by: Rhys Hiltner <rhys.hiltner@gmail.com> Reviewed-by: Michael Knyszek <mknyszek@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Auto-Submit: Michael Knyszek <mknyszek@google.com>
This commit is contained in:
parent
c77ada1b78
commit
3968a5bca4
|
|
@ -26,6 +26,7 @@ func ASanWrite(addr unsafe.Pointer, len int) {
|
||||||
|
|
||||||
// Private interface for the runtime.
|
// Private interface for the runtime.
|
||||||
const asanenabled = true
|
const asanenabled = true
|
||||||
|
const asanenabledBit = 1
|
||||||
|
|
||||||
// asan{read,write} are nosplit because they may be called between
|
// asan{read,write} are nosplit because they may be called between
|
||||||
// fork and exec, when the stack must not grow. See issue #50391.
|
// fork and exec, when the stack must not grow. See issue #50391.
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
const asanenabled = false
|
const asanenabled = false
|
||||||
|
const asanenabledBit = 0
|
||||||
|
|
||||||
// Because asanenabled is false, none of these functions should be called.
|
// Because asanenabled is false, none of these functions should be called.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -90,7 +90,7 @@ type mWaitList struct {
|
||||||
|
|
||||||
// lockVerifyMSize confirms that we can recreate the low bits of the M pointer.
|
// lockVerifyMSize confirms that we can recreate the low bits of the M pointer.
|
||||||
func lockVerifyMSize() {
|
func lockVerifyMSize() {
|
||||||
size := roundupsize(unsafe.Sizeof(m{}), false) + mallocHeaderSize
|
size := roundupsize(unsafe.Sizeof(mPadded{}), false) + mallocHeaderSize
|
||||||
if size&mutexMMask != 0 {
|
if size&mutexMMask != 0 {
|
||||||
print("M structure uses sizeclass ", size, "/", hex(size), " bytes; ",
|
print("M structure uses sizeclass ", size, "/", hex(size), " bytes; ",
|
||||||
"incompatible with mutex flag mask ", hex(mutexMMask), "\n")
|
"incompatible with mutex flag mask ", hex(mutexMMask), "\n")
|
||||||
|
|
|
||||||
|
|
@ -2256,7 +2256,7 @@ func allocm(pp *p, fn func(), id int64) *m {
|
||||||
unlock(&sched.lock)
|
unlock(&sched.lock)
|
||||||
}
|
}
|
||||||
|
|
||||||
mp := new(m)
|
mp := &new(mPadded).m
|
||||||
mp.mstartfn = fn
|
mp.mstartfn = fn
|
||||||
mcommoninit(mp, id)
|
mcommoninit(mp, id)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -619,13 +619,18 @@ type m struct {
|
||||||
// Up to 10 locks held by this m, maintained by the lock ranking code.
|
// Up to 10 locks held by this m, maintained by the lock ranking code.
|
||||||
locksHeldLen int
|
locksHeldLen int
|
||||||
locksHeld [10]heldLockInfo
|
locksHeld [10]heldLockInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
const mRedZoneSize = (16 << 3) * asanenabledBit // redZoneSize(2048)
|
||||||
|
|
||||||
|
type mPadded struct {
|
||||||
|
m
|
||||||
|
|
||||||
// Size the runtime.m structure so it fits in the 2048-byte size class, and
|
// Size the runtime.m structure so it fits in the 2048-byte size class, and
|
||||||
// not in the next-smallest (1792-byte) size class. That leaves the 11 low
|
// not in the next-smallest (1792-byte) size class. That leaves the 11 low
|
||||||
// bits of muintptr values available for flags, as required for
|
// bits of muintptr values available for flags, as required for
|
||||||
// GOEXPERIMENT=spinbitmutex.
|
// GOEXPERIMENT=spinbitmutex.
|
||||||
_ [goexperiment.SpinbitMutexInt * 64 * goarch.PtrSize / 8]byte
|
_ [goexperiment.SpinbitMutexInt * (2048 - mallocHeaderSize - mRedZoneSize - unsafe.Sizeof(m{}))]byte
|
||||||
_ [goexperiment.SpinbitMutexInt * 700 * (2 - goarch.PtrSize/4)]byte
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type p struct {
|
type p struct {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue