aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/stack.go
diff options
context:
space:
mode:
authorAustin Clements <austin@google.com>2015-11-23 15:03:38 -0500
committerRuss Cox <rsc@golang.org>2015-11-24 01:50:52 +0000
commitecf388f3a4dda0ffb1b11f65d2f5d703e7e4133f (patch)
tree91107a0af32b9efe941b9dce2f614236bc6af546 /src/runtime/stack.go
parentab4c9298b8185a056ff1152f2c7bd9b38d3d06f3 (diff)
downloadgo-ecf388f3a4dda0ffb1b11f65d2f5d703e7e4133f.tar.xz
runtime: take stack barrier lock during copystack
Commit bbd1a1c prevented SIGPROF from scanning stacks that were being copied, but it didn't prevent a stack copy (specifically a stack shrink) from happening while SIGPROF is scanning the stack. As a result, a stack copy may adjust stack barriers while SIGPROF is in the middle of scanning a stack, causing SIGPROF to panic when it detects an inconsistent stack barrier. Fix this by taking the stack barrier lock while adjusting the stack. In addition to preventing SIGPROF from scanning this stack, this will block until any in-progress SIGPROF is done scanning the stack. For 1.5.2. Fixes #13362. Updates #12932. Change-Id: I422219c363054410dfa56381f7b917e04690e5dd Reviewed-on: https://go-review.googlesource.com/17191 Run-TryBot: Austin Clements <austin@google.com> Reviewed-by: Russ Cox <rsc@golang.org> Run-TryBot: Russ Cox <rsc@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/runtime/stack.go')
-rw-r--r--src/runtime/stack.go6
1 files changed, 6 insertions, 0 deletions
diff --git a/src/runtime/stack.go b/src/runtime/stack.go
index 00cd6aeb1d..8f31c936be 100644
--- a/src/runtime/stack.go
+++ b/src/runtime/stack.go
@@ -719,6 +719,10 @@ func copystack(gp *g, newsize uintptr) {
print("copystack gp=", gp, " [", hex(old.lo), " ", hex(old.hi-used), " ", hex(old.hi), "]/", gp.stackAlloc, " -> [", hex(new.lo), " ", hex(new.hi-used), " ", hex(new.hi), "]/", newsize, "\n")
}
+ // Disallow sigprof scans of this stack and block if there's
+ // one in progress.
+ gcLockStackBarriers(gp)
+
// adjust pointers in the to-be-copied frames
var adjinfo adjustinfo
adjinfo.old = old
@@ -751,6 +755,8 @@ func copystack(gp *g, newsize uintptr) {
gp.stkbar = newstkbar
gp.stktopsp += adjinfo.delta
+ gcUnlockStackBarriers(gp)
+
// free old stack
if stackPoisonCopy != 0 {
fillstack(old, 0xfc)