]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: make consistentHeapStats acquire/release nosplit
authorMichael Anthony Knyszek <mknyszek@google.com>
Wed, 3 Nov 2021 18:49:51 +0000 (18:49 +0000)
committerMichael Knyszek <mknyszek@google.com>
Fri, 5 Nov 2021 17:52:30 +0000 (17:52 +0000)
consistentHeapStats is updated during a stack allocation, so a stack
growth during an acquire or release could cause another acquire to
happen before the operation completes fully. This may lead to an invalid
sequence number.

Fixes #49395.

Change-Id: I41ce3393dff80201793e053d4d6394d7b211a5b7
Reviewed-on: https://go-review.googlesource.com/c/go/+/361158
Trust: Michael Knyszek <mknyszek@google.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
Reviewed-by: Austin Clements <austin@google.com>
src/runtime/mstats.go

index 341ba9a9365c2eef81ad998d5ab173785f3d2f0d..c2303e5b8ec0617f9777f63248e4a8d5e797af2c 100644 (file)
@@ -790,7 +790,15 @@ type consistentHeapStats struct {
 //
 // The caller's P must not change between acquire and
 // release. This also means that the caller should not
-// acquire a P or release its P in between.
+// acquire a P or release its P in between. A P also must
+// not acquire a given consistentHeapStats if it hasn't
+// yet released it.
+//
+// nosplit because a stack growth in this function could
+// lead to a stack allocation that could reenter the
+// function.
+//
+//go:nosplit
 func (m *consistentHeapStats) acquire() *heapStatsDelta {
        if pp := getg().m.p.ptr(); pp != nil {
                seq := atomic.Xadd(&pp.statsSeq, 1)
@@ -814,6 +822,12 @@ func (m *consistentHeapStats) acquire() *heapStatsDelta {
 // The caller's P must not change between acquire and
 // release. This also means that the caller should not
 // acquire a P or release its P in between.
+//
+// nosplit because a stack growth in this function could
+// lead to a stack allocation that causes another acquire
+// before this operation has completed.
+//
+//go:nosplit
 func (m *consistentHeapStats) release() {
        if pp := getg().m.p.ptr(); pp != nil {
                seq := atomic.Xadd(&pp.statsSeq, 1)