diff options
author | Austin Clements <austin@google.com> | 2019-10-04 18:54:00 -0400 |
---|---|---|
committer | Austin Clements <austin@google.com> | 2019-10-25 23:25:36 +0000 |
commit | d1969015b4ac29be4f518b94817d3f525380639d (patch) | |
tree | 43864832e4bb2cd623f6c6b423f1011b6f2a5d92 /src/runtime/mgcwork.go | |
parent | 60586034713cc94477868fb6911f34cfcc6a1ba4 (diff) | |
download | go-d1969015b4ac29be4f518b94817d3f525380639d.tar.gz go-d1969015b4ac29be4f518b94817d3f525380639d.zip |
runtime: abstract M preemption check into a function
We check whether an M is preemptible in a surprising number of places.
Put it in one function.
For #10958, #24543.
Change-Id: I305090fdb1ea7f7a55ffe25851c1e35012d0d06c
Reviewed-on: https://go-review.googlesource.com/c/go/+/201439
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Diffstat (limited to 'src/runtime/mgcwork.go')
-rw-r--r-- | src/runtime/mgcwork.go | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/src/runtime/mgcwork.go b/src/runtime/mgcwork.go index f2c16d7d8c..927b06c3f9 100644 --- a/src/runtime/mgcwork.go +++ b/src/runtime/mgcwork.go @@ -126,12 +126,12 @@ func (w *gcWork) checkPut(ptr uintptr, ptrs []uintptr) { if debugCachedWork { alreadyFailed := w.putGen == w.pauseGen w.putGen = w.pauseGen - if m := getg().m; m.locks > 0 || m.mallocing != 0 || m.preemptoff != "" || m.p.ptr().status != _Prunning { + if !canPreemptM(getg().m) { // If we were to spin, the runtime may - // deadlock: the condition above prevents - // preemption (see newstack), which could - // prevent gcMarkDone from finishing the - // ragged barrier and releasing the spin. + // deadlock. Since we can't be preempted, the + // spin could prevent gcMarkDone from + // finishing the ragged barrier, which is what + // releases us from the spin. return } for atomic.Load(&gcWorkPauseGen) == w.pauseGen { |