Commit 3873e549 authored by Cherry Zhang's avatar Cherry Zhang Committed by Austin Clements

runtime: don't async preempt NO_LOCAL_POINTERS assembly functions

We don't async preempt assembly functions. We do that by checking
whether the function has a local pointer map, and assume it is
an assembly (or, non-Go) function if there isn't one. However,
assembly functions marked with NO_LOCAL_POINTERS still have local
pointer maps, and we wouldn't identify them. For them, check for
the special pointer map runtime.no_pointers_stackmap as well, and
treat them as not async preemptible.

Change-Id: I1301e3b4d35893c31c4c5a5147a0d775987bd6f4
Reviewed-on: https://go-review.googlesource.com/c/go/+/202337Reviewed-by: default avatarAustin Clements <austin@google.com>
parent 7955eceb
...@@ -55,6 +55,7 @@ package runtime ...@@ -55,6 +55,7 @@ package runtime
import ( import (
"runtime/internal/atomic" "runtime/internal/atomic"
"runtime/internal/sys" "runtime/internal/sys"
"unsafe"
) )
type suspendGState struct { type suspendGState struct {
...@@ -369,9 +370,12 @@ func isAsyncSafePoint(gp *g, pc, sp uintptr) bool { ...@@ -369,9 +370,12 @@ func isAsyncSafePoint(gp *g, pc, sp uintptr) bool {
// functions (except at calls). // functions (except at calls).
return false return false
} }
if funcdata(f, _FUNCDATA_LocalsPointerMaps) == nil { if fd := funcdata(f, _FUNCDATA_LocalsPointerMaps); fd == nil || fd == unsafe.Pointer(&no_pointers_stackmap) {
// This is assembly code. Don't assume it's // This is assembly code. Don't assume it's
// well-formed. // well-formed. We identify assembly code by
// checking that it has either no stack map, or
// no_pointers_stackmap, which is the stack map
// for ones marked as NO_LOCAL_POINTERS.
// //
// TODO: Are there cases that are safe but don't have a // TODO: Are there cases that are safe but don't have a
// locals pointer map, like empty frame functions? // locals pointer map, like empty frame functions?
...@@ -395,3 +399,5 @@ func isAsyncSafePoint(gp *g, pc, sp uintptr) bool { ...@@ -395,3 +399,5 @@ func isAsyncSafePoint(gp *g, pc, sp uintptr) bool {
return true return true
} }
var no_pointers_stackmap uint64 // defined in assembly, for NO_LOCAL_POINTERS macro
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment