]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: fix idle time double-counting bug
authorMichael Anthony Knyszek <mknyszek@google.com>
Tue, 15 Jul 2025 17:11:18 +0000 (17:11 +0000)
committerMichael Knyszek <mknyszek@google.com>
Wed, 16 Jul 2025 20:31:59 +0000 (13:31 -0700)
This change fixes a bug in the accounting of sched.idleTime. In just the
case where the GC CPU limiter needs up-to-date data, sched.idleTime is
incremented in both the P-idle-time and idle-mark-work paths, but it
should only be incremented in the former case.

Fixes #74627.

Change-Id: If41b03da102d47d25bec48ff750a9da27019b71d
Reviewed-on: https://go-review.googlesource.com/c/go/+/687998
Reviewed-by: Cherry Mui <cherryyz@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
src/runtime/mgclimit.go

index ad86fbd65bceb34fcf667c0b7d4c7c482b0b55a4..80aeb71cad61853a81eaf0eedf3ac70d689c88b8 100644 (file)
@@ -209,14 +209,12 @@ func (l *gcCPULimiterState) updateLocked(now int64) {
                for _, pp := range allp {
                        typ, duration := pp.limiterEvent.consume(now)
                        switch typ {
-                       case limiterEventIdleMarkWork:
-                               fallthrough
                        case limiterEventIdle:
-                               idleTime += duration
                                sched.idleTime.Add(duration)
-                       case limiterEventMarkAssist:
-                               fallthrough
-                       case limiterEventScavengeAssist:
+                               idleTime += duration
+                       case limiterEventIdleMarkWork:
+                               idleTime += duration
+                       case limiterEventMarkAssist, limiterEventScavengeAssist:
                                assistTime += duration
                        case limiterEventNone:
                                break
@@ -470,14 +468,12 @@ func (e *limiterEvent) stop(typ limiterEventType, now int64) {
        }
        // Account for the event.
        switch typ {
-       case limiterEventIdleMarkWork:
-               gcCPULimiter.addIdleTime(duration)
        case limiterEventIdle:
-               gcCPULimiter.addIdleTime(duration)
                sched.idleTime.Add(duration)
-       case limiterEventMarkAssist:
-               fallthrough
-       case limiterEventScavengeAssist:
+               gcCPULimiter.addIdleTime(duration)
+       case limiterEventIdleMarkWork:
+               gcCPULimiter.addIdleTime(duration)
+       case limiterEventMarkAssist, limiterEventScavengeAssist:
                gcCPULimiter.addAssistTime(duration)
        default:
                throw("limiterEvent.stop: invalid limiter event type found")