The CgocallbackDone function calls dropm after it calls entersyscall, which means that dropm must not have any write barriers. Mark it accordingly. Bootstrapped and ran Go testsuite on x86_64-pc-linux-gnu. Committed to mainline.
Ian
Index: gcc/go/gofrontend/MERGE =================================================================== --- gcc/go/gofrontend/MERGE (revision 249576) +++ gcc/go/gofrontend/MERGE (working copy) @@ -1,4 +1,4 @@ -55b2b2dee55bd495a770347daaf858634057ecb0 +c5aa42107d116c9121de447d214297c88dd9f5fa The first line of this file holds the git revision number of the last merge done from the gofrontend repository. Index: libgo/go/runtime/os_gccgo.go =================================================================== --- libgo/go/runtime/os_gccgo.go (revision 249205) +++ libgo/go/runtime/os_gccgo.go (working copy) @@ -32,6 +32,7 @@ func minit() { // Called from dropm to undo the effect of an minit. //go:nosplit +//go:nowritebarrierrec func unminit() { unminitSignals() } Index: libgo/go/runtime/proc.go =================================================================== --- libgo/go/runtime/proc.go (revision 249576) +++ libgo/go/runtime/proc.go (working copy) @@ -1447,6 +1447,9 @@ func oneNewExtraM() { // in which dropm happens on each cgo call, is still correct too. // We may have to keep the current version on systems with cgo // but without pthreads, like Windows. +// +// CgocallBackDone calls this after releasing p, so no write barriers. +//go:nowritebarrierrec func dropm() { // Clear m and g, and return m to the extra list. // After the call to setg we can only call nosplit functions @@ -1492,6 +1495,7 @@ var extraMWaiters uint32 // return a nil list head if that's what it finds. If nilokay is false, // lockextra will keep waiting until the list head is no longer nil. //go:nosplit +//go:nowritebarrierrec func lockextra(nilokay bool) *m { const locked = 1 @@ -1524,6 +1528,7 @@ func lockextra(nilokay bool) *m { } //go:nosplit +//go:nowritebarrierrec func unlockextra(mp *m) { atomic.Storeuintptr(&extram, uintptr(unsafe.Pointer(mp))) } Index: libgo/go/runtime/signal_unix.go =================================================================== --- libgo/go/runtime/signal_unix.go (revision 249205) +++ libgo/go/runtime/signal_unix.go (working copy) @@ -599,6 +599,7 @@ func minitSignalMask() { // unminitSignals is called from dropm, via unminit, to undo the // effect of calling minit on a non-Go thread. //go:nosplit +//go:nowritebarrierrec func unminitSignals() { if getg().m.newSigstack { signalstack(nil, 0)