diff --git a/src/runtime/proc.go b/src/runtime/proc.go index 2c8750a5fef..b5e1c3e3b19 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -2004,12 +2004,7 @@ func oneNewExtraM() { gp.racectx = racegostart(abi.FuncPCABIInternal(newextram) + sys.PCQuantum) } if traceEnabled() { - // Trigger two trace events for the locked g in the extra m, - // since the next event of the g will be traceEvGoSysExit in exitsyscall, - // while calling from C thread to Go. - traceGoCreate(gp, 0) // no start pc - gp.traceseq++ - traceEvent(traceEvGoInSyscall, -1, gp.goid) + traceOneNewExtraM(gp) } // put on allg for garbage collector allgadd(gp) diff --git a/src/runtime/trace.go b/src/runtime/trace.go index fd3ee273a38..27d58c22175 100644 --- a/src/runtime/trace.go +++ b/src/runtime/trace.go @@ -1713,3 +1713,16 @@ func startPCforTrace(pc uintptr) uintptr { } return f.datap.textAddr(*(*uint32)(w)) } + +// traceOneNewExtraM registers the fact that a new extra M was created with +// the tracer. This matters if the M (which has an attached G) is used while +// the trace is still active because if it is, we need the fact that it exists +// to show up in the final trace. +func traceOneNewExtraM(gp *g) { + // Trigger two trace events for the locked g in the extra m, + // since the next event of the g will be traceEvGoSysExit in exitsyscall, + // while calling from C thread to Go. + traceGoCreate(gp, 0) // no start pc + gp.traceseq++ + traceEvent(traceEvGoInSyscall, -1, gp.goid) +}