• Austin Clements's avatar
    runtime: make SIGPROF skip stacks that are being copied · bbd1a1c7
    Austin Clements authored
    sigprof tracebacks the stack across systemstack switches to make
    profile tracebacks more complete. However, it does this even if the
    user stack is currently being copied, which means it may be in an
    inconsistent state that will cause the traceback to panic.
    
    One specific way this can happen is during stack shrinking. Some
    goroutine blocks for STW, then enters gchelper, which then assists
    with root marking. If that root marking happens to pick the original
    goroutine and its stack needs to be shrunk, it will begin to copy that
    stack. During this copy, the stack is generally inconsistent and, in
    particular, the actual locations of the stack barriers and their
    recorded locations are temporarily out of sync. If a SIGPROF happens
    during this inconsistency, it will walk the stack all the way back to
    the blocked goroutine and panic when it fails to unwind the stack
    barriers.
    
    Fix this by disallowing jumping to the user stack during SIGPROF if
    that user stack is in the process of being copied.
    
    Fixes #12932.
    
    Change-Id: I9ef694c2c01e3653e292ce22612418dd3daff1b4
    Reviewed-on: https://go-review.googlesource.com/16819Reviewed-by: 's avatarDaniel Morsing <daniel.morsing@gmail.com>
    Run-TryBot: Austin Clements <austin@google.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    bbd1a1c7
Name
Last commit
Last update
..
archive Loading commit data...
bufio Loading commit data...
builtin Loading commit data...
bytes Loading commit data...
cmd Loading commit data...
compress Loading commit data...
container Loading commit data...
crypto Loading commit data...
database/sql Loading commit data...
debug Loading commit data...
encoding Loading commit data...
errors Loading commit data...
expvar Loading commit data...
flag Loading commit data...
fmt Loading commit data...
go Loading commit data...
hash Loading commit data...
html Loading commit data...
image Loading commit data...
index/suffixarray Loading commit data...
internal Loading commit data...
io Loading commit data...
log Loading commit data...
math Loading commit data...
mime Loading commit data...
net Loading commit data...
os Loading commit data...
path Loading commit data...
reflect Loading commit data...
regexp Loading commit data...
runtime Loading commit data...
sort Loading commit data...
strconv Loading commit data...
strings Loading commit data...
sync Loading commit data...
syscall Loading commit data...
testing Loading commit data...
text Loading commit data...
time Loading commit data...
unicode Loading commit data...
unsafe Loading commit data...
vendor/golang.org/x/net/http2/hpack Loading commit data...
Make.dist Loading commit data...
all.bash Loading commit data...
all.bat Loading commit data...
all.rc Loading commit data...
androidtest.bash Loading commit data...
bootstrap.bash Loading commit data...
buildall.bash Loading commit data...
clean.bash Loading commit data...
clean.bat Loading commit data...
clean.rc Loading commit data...
iostest.bash Loading commit data...
make.bash Loading commit data...
make.bat Loading commit data...
make.rc Loading commit data...
nacltest.bash Loading commit data...
race.bash Loading commit data...
race.bat Loading commit data...
run.bash Loading commit data...
run.bat Loading commit data...
run.rc Loading commit data...