From 7b229001e710f48134a51b2f5abebda4b35d9de4 Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Mon, 23 Nov 2015 18:44:03 -0500 Subject: [PATCH] runtime: pass gcWork to markroot Currently markroot uses a gcWork on the stack and disposes of it immediately after marking one root. This used to be necessary because markroot was called from the depths of parfor, but now that we call it directly and have ready access to a gcWork at the call site, pass the gcWork in, use it directly in markroot, and share it across calls to markroot from the same P. Change-Id: Id7c3b811bfb944153760e01873c07c8d18909be1 Reviewed-on: https://go-review.googlesource.com/19635 Reviewed-by: Rick Hudson Run-TryBot: Austin Clements --- src/runtime/mgcmark.go | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/src/runtime/mgcmark.go b/src/runtime/mgcmark.go index eac45ec168..0be908bfe8 100644 --- a/src/runtime/mgcmark.go +++ b/src/runtime/mgcmark.go @@ -98,10 +98,7 @@ var oneptrmask = [...]uint8{1} // Preemption must be disabled (because this uses a gcWork). // //go:nowritebarrier -func markroot(i uint32) { - // TODO: Consider using getg().m.p.ptr().gcw. - var gcw gcWork - +func markroot(gcw *gcWork, i uint32) { baseData := uint32(fixedRootCount) baseBSS := baseData + uint32(work.nDataRoots) baseSpans := baseBSS + uint32(work.nBSSRoots) @@ -111,17 +108,17 @@ func markroot(i uint32) { switch { case baseData <= i && i < baseBSS: for datap := &firstmoduledata; datap != nil; datap = datap.next { - markrootBlock(datap.data, datap.edata-datap.data, datap.gcdatamask.bytedata, &gcw, int(i-baseData)) + markrootBlock(datap.data, datap.edata-datap.data, datap.gcdatamask.bytedata, gcw, int(i-baseData)) } case baseBSS <= i && i < baseSpans: for datap := &firstmoduledata; datap != nil; datap = datap.next { - markrootBlock(datap.bss, datap.ebss-datap.bss, datap.gcbssmask.bytedata, &gcw, int(i-baseBSS)) + markrootBlock(datap.bss, datap.ebss-datap.bss, datap.gcbssmask.bytedata, gcw, int(i-baseBSS)) } case i == fixedRootFinalizers: for fb := allfin; fb != nil; fb = fb.alllink { - scanblock(uintptr(unsafe.Pointer(&fb.fin[0])), uintptr(fb.cnt)*unsafe.Sizeof(fb.fin[0]), &finptrmask[0], &gcw) + scanblock(uintptr(unsafe.Pointer(&fb.fin[0])), uintptr(fb.cnt)*unsafe.Sizeof(fb.fin[0]), &finptrmask[0], gcw) } case i == fixedRootFlushCaches: @@ -131,7 +128,7 @@ func markroot(i uint32) { case baseSpans <= i && i < baseStacks: // mark MSpan.specials - markrootSpans(&gcw, int(i-baseSpans)) + markrootSpans(gcw, int(i-baseSpans)) default: // the rest is scanning goroutine stacks @@ -193,8 +190,6 @@ func markroot(i uint32) { } }) } - - gcw.dispose() } // markrootBlock scans the shard'th shard of the block of memory [b0, @@ -808,8 +803,7 @@ func gcDrain(gcw *gcWork, flags gcDrainFlags) { if job >= work.markrootJobs { break } - // TODO: Pass in gcw. - markroot(job) + markroot(gcw, job) } } -- 2.50.0