diff options
| author | Austin Clements <austin@google.com> | 2019-04-03 14:47:55 -0400 |
|---|---|---|
| committer | Austin Clements <austin@google.com> | 2019-04-05 20:19:59 +0000 |
| commit | 68d89bb8e05afc2aa050b4c5ad0df4b3af03c45d (patch) | |
| tree | 60f595a8e96eb449910f083c6a5e2aa67dcd4dce /src/runtime | |
| parent | ea9859f858b603cbf49f0a930f83c56a716490a4 (diff) | |
| download | go-68d89bb8e05afc2aa050b4c5ad0df4b3af03c45d.tar.xz | |
runtime: separate stack freeing from stack shrinking
Currently, shrinkstack will free the stack if the goroutine is dead.
There are only two places that call shrinkstack: scanstack, which will
never call it if the goroutine is dead; and markrootFreeGStacks, which
only calls it on dead goroutines.
Clean this up by separating stack freeing out of shrinkstack.
Change-Id: I7d7891e620550c32a2220833923a025704986681
Reviewed-on: https://go-review.googlesource.com/c/go/+/170890
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
Diffstat (limited to 'src/runtime')
| -rw-r--r-- | src/runtime/mgcmark.go | 4 | ||||
| -rw-r--r-- | src/runtime/stack.go | 10 |
2 files changed, 3 insertions, 11 deletions
diff --git a/src/runtime/mgcmark.go b/src/runtime/mgcmark.go index cc4e7d06d3..91f79c44db 100644 --- a/src/runtime/mgcmark.go +++ b/src/runtime/mgcmark.go @@ -270,7 +270,9 @@ func markrootFreeGStacks() { // Free stacks. q := gQueue{list.head, list.head} for gp := list.head.ptr(); gp != nil; gp = gp.schedlink.ptr() { - shrinkstack(gp) + stackfree(gp.stack) + gp.stack.lo = 0 + gp.stack.hi = 0 // Manipulate the queue directly since the Gs are // already all linked the right way. q.tail.set(gp) diff --git a/src/runtime/stack.go b/src/runtime/stack.go index 85902a6b68..d5d09ba7d7 100644 --- a/src/runtime/stack.go +++ b/src/runtime/stack.go @@ -1077,16 +1077,6 @@ func gostartcallfn(gobuf *gobuf, fv *funcval) { // gp must be stopped, but the world need not be. func shrinkstack(gp *g) { gstatus := readgstatus(gp) - if gstatus&^_Gscan == _Gdead { - if gp.stack.lo != 0 { - // Free whole stack - it will get reallocated - // if G is used again. - stackfree(gp.stack) - gp.stack.lo = 0 - gp.stack.hi = 0 - } - return - } if gp.stack.lo == 0 { throw("missing stack in shrinkstack") } |
