]> Cypherpunks repositories - gostls13.git/commit
runtime: make shrinkstack concurrent-safe
authorAustin Clements <austin@google.com>
Mon, 15 Feb 2016 22:38:06 +0000 (17:38 -0500)
committerAustin Clements <austin@google.com>
Wed, 16 Mar 2016 20:13:20 +0000 (20:13 +0000)
commit276b1777717ec5a0a02364a5aee806f8076bb60b
tree71a951c4987ff43c58cebaf4b73c9e87820dfbfd
parentd45bf7228f742e63a30eef03e5288df332906838
runtime: make shrinkstack concurrent-safe

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/20042
Reviewed-by: Keith Randall <khr@golang.org>
Run-TryBot: Austin Clements <austin@google.com>
src/runtime/chan_test.go
src/runtime/runtime2.go
src/runtime/stack.go