default:
throw("gcBgMarkWorker: unexpected gcMarkWorkerMode")
case gcMarkWorkerDedicatedMode:
- gcDrain(&p.gcw, gcBgCreditSlack, gcDrainBlock)
+ gcDrain(&p.gcw, gcDrainBlock|gcDrainFlushBgCredit)
// gcDrain did the xadd(&work.nwait +1) to
// match the decrement above. It only returns
// at a mark completion point.
throw("gcDrain returned with buffer")
}
case gcMarkWorkerFractionalMode, gcMarkWorkerIdleMode:
- gcDrain(&p.gcw, gcBgCreditSlack, gcDrainUntilPreempt)
+ gcDrain(&p.gcw, gcDrainUntilPreempt|gcDrainFlushBgCredit)
// If we are nearing the end of mark, dispose
// of the cache promptly. We must do this
parfordo(work.markfor)
var gcw gcWork
- gcDrain(&gcw, -1, gcDrainBlock)
+ gcDrain(&gcw, gcDrainBlock)
gcw.dispose()
if work.full != 0 {
parfordo(work.markfor)
if gcphase != _GCscan {
var gcw gcWork
- gcDrain(&gcw, -1, gcDrainBlock) // blocks in getfull
+ gcDrain(&gcw, gcDrainBlock) // blocks in getfull
gcw.dispose()
}
const (
gcDrainUntilPreempt gcDrainFlags = 1 << iota
+ gcDrainFlushBgCredit
// gcDrainBlock is the opposite of gcDrainUntilPreempt. This
// is the default, but callers should use the constant for
// g.preempt is set. Otherwise, this will block until all dedicated
// workers are blocked in gcDrain.
//
-// If flushScanCredit != -1, gcDrain flushes accumulated scan work
-// credit to gcController.bgScanCredit whenever gcw's local scan work
-// credit exceeds flushScanCredit.
+// If flags&gcDrainFlushBgCredit != 0, gcDrain flushes scan work
+// credit to gcController.bgScanCredit every gcBgCreditSlack units of
+// scan work.
//go:nowritebarrier
-func gcDrain(gcw *gcWork, flushScanCredit int64, flags gcDrainFlags) {
+func gcDrain(gcw *gcWork, flags gcDrainFlags) {
if !writeBarrierEnabled {
throw("gcDrain phase incorrect")
}
blocking := flags&gcDrainUntilPreempt == 0
+ flushBgCredit := flags&gcDrainFlushBgCredit != 0
var lastScanFlush, nextScanFlush int64
- if flushScanCredit != -1 {
+ if flushBgCredit {
lastScanFlush = gcw.scanWork
- nextScanFlush = lastScanFlush + flushScanCredit
+ nextScanFlush = lastScanFlush + gcBgCreditSlack
} else {
nextScanFlush = int64(^uint64(0) >> 1)
}
credit := gcw.scanWork - lastScanFlush
xaddint64(&gcController.bgScanCredit, credit)
lastScanFlush = gcw.scanWork
- nextScanFlush = lastScanFlush + flushScanCredit
+ nextScanFlush = lastScanFlush + gcBgCreditSlack
}
}
- if flushScanCredit != -1 {
+ if flushBgCredit {
credit := gcw.scanWork - lastScanFlush
xaddint64(&gcController.bgScanCredit, credit)
}