• 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
stack.go 33.8 KB