runtime: make sysmon-triggered GC concurrent
sysmon triggers a GC if there has been no GC for two minutes.
Currently, this is a STW GC. There is no reason for this to be STW, so
make it concurrent.
Fixes #10261.
Change-Id: I92f3ac37272d5c2a31480ff1fa897ebad08775a9
Reviewed-on: https://go-review.googlesource.com/11955
Reviewed-by: Rob Pike <r@golang.org>
Reviewed-by: Russ Cox <rsc@golang.org>
diff --git a/src/runtime/proc.go b/src/runtime/proc.go
index 805b96e..1a4c6c1 100644
--- a/src/runtime/proc.go
+++ b/src/runtime/proc.go
@@ -154,7 +154,7 @@
if debug.gctrace > 0 {
println("GC forced")
}
- startGC(gcForceMode)
+ startGC(gcBackgroundMode)
}
}
diff --git a/src/runtime/proc1.go b/src/runtime/proc1.go
index 6a163c6..a048ded 100644
--- a/src/runtime/proc1.go
+++ b/src/runtime/proc1.go
@@ -3004,7 +3004,7 @@
}
// check if we need to force a GC
lastgc := int64(atomicload64(&memstats.last_gc))
- if lastgc != 0 && unixnow-lastgc > forcegcperiod && atomicload(&forcegc.idle) != 0 {
+ if lastgc != 0 && unixnow-lastgc > forcegcperiod && atomicload(&forcegc.idle) != 0 && atomicloaduint(&bggc.working) == 0 {
lock(&forcegc.lock)
forcegc.idle = 0
forcegc.g.schedlink = 0