• Austin Clements's avatar
    runtime: make shrinkstack concurrent-safe · 276b1777
    Austin Clements authored
    Currently shinkstack is only safe during STW because it adjusts
    channel-related stack pointers and moves send/receive stack slots
    without synchronizing with the channel code. Make it safe to use when
    the world isn't stopped by:
    
    1) Locking all channels the G is blocked on while adjusting the sudogs
       and copying the area of the stack that may contain send/receive
       slots.
    
    2) For any stack frames that may contain send/receive slot, using an
       atomic CAS to adjust pointers to prevent races between adjusting a
       pointer in a receive slot and a concurrent send writing to that
       receive slot.
    
    In principle, the synchronization could be finer-grained. For example,
    we considered synchronizing around the sudogs, which would allow
    channel operations involving other Gs to continue if the G being
    shrunk was far enough down the send/receive queue. However, using the
    channel lock means no additional locks are necessary in the channel
    code. Furthermore, the stack shrinking code holds the channel lock for
    a very short time (much less than the time required to shrink the
    stack).
    
    This does not yet make stack shrinking concurrent; it merely makes
    doing so safe.
    
    This has negligible effect on the go1 and garbage benchmarks.
    
    For #12967.
    
    Change-Id: Ia49df3a8a7be4b36e365aac4155a2416b94b988c
    Reviewed-on: https://go-review.googlesource.com/20042Reviewed-by: 's avatarKeith Randall <khr@golang.org>
    Run-TryBot: Austin Clements <austin@google.com>
    276b1777
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 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...