]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: switch p.gcFractionalMarkTime to atomic.Int64
authorMichael Pratt <mpratt@google.com>
Thu, 30 Oct 2025 20:33:30 +0000 (16:33 -0400)
committerGopher Robot <gobot@golang.org>
Wed, 12 Nov 2025 16:26:55 +0000 (08:26 -0800)
atomic.Int64 automatically maintains proper alignment, avoiding the need
to manually adjust alignment back and forth as fields above change.

Change-Id: I6a6a636c4c3c366353f6dc8ecac473c075dd5cd9
Reviewed-on: https://go-review.googlesource.com/c/go/+/716700
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
Auto-Submit: Michael Pratt <mpratt@google.com>

src/runtime/align_runtime_test.go
src/runtime/mgc.go
src/runtime/mgcpacer.go
src/runtime/runtime2.go

index 4bcb49db2f51dce9e7da0fedcec4d94cfc270b61..8b21934a75f1e2f5b1d2600ea3dbc406cf2c4c45 100644 (file)
@@ -14,7 +14,6 @@ import "unsafe"
 // operations (all the *64 operations in internal/runtime/atomic).
 var AtomicFields = []uintptr{
        unsafe.Offsetof(m{}.procid),
-       unsafe.Offsetof(p{}.gcFractionalMarkTime),
        unsafe.Offsetof(profBuf{}.overflow),
        unsafe.Offsetof(profBuf{}.overflowTime),
        unsafe.Offsetof(heapStatsDelta{}.tinyAllocCount),
index 22150dfd170390daf102c22cae0d77b4791a71d0..43afbc330bb71cf88cb1b1cc2e1365afb09ce35c 100644 (file)
@@ -316,7 +316,7 @@ func pollFractionalWorkerExit() bool {
                return true
        }
        p := getg().m.p.ptr()
-       selfTime := p.gcFractionalMarkTime + (now - p.gcMarkWorkerStartTime)
+       selfTime := p.gcFractionalMarkTime.Load() + (now - p.gcMarkWorkerStartTime)
        // Add some slack to the utilization goal so that the
        // fractional worker isn't behind again the instant it exits.
        return float64(selfTime)/float64(delta) > 1.2*gcController.fractionalUtilizationGoal
@@ -1858,7 +1858,7 @@ func gcBgMarkWorker(ready chan struct{}) {
                        pp.limiterEvent.stop(limiterEventIdleMarkWork, now)
                }
                if pp.gcMarkWorkerMode == gcMarkWorkerFractionalMode {
-                       atomic.Xaddint64(&pp.gcFractionalMarkTime, duration)
+                       pp.gcFractionalMarkTime.Add(duration)
                }
 
                // We'll releasem after this point and thus this P may run
index bd454b5ceaba4cd62a6616bbaa377c87b26da8f8..32c1b941e538a3e3738bc72f2abe9b51b0ce26ed 100644 (file)
@@ -427,7 +427,7 @@ func (c *gcControllerState) startCycle(markStartTime int64, procs int, trigger g
        // Clear per-P state
        for _, p := range allp {
                p.gcAssistTime = 0
-               p.gcFractionalMarkTime = 0
+               p.gcFractionalMarkTime.Store(0)
        }
 
        if trigger.kind == gcTriggerTime {
@@ -830,7 +830,7 @@ func (c *gcControllerState) findRunnableGCWorker(pp *p, now int64) (*g, int64) {
                //
                // This should be kept in sync with pollFractionalWorkerExit.
                delta := now - c.markStartTime
-               if delta > 0 && float64(pp.gcFractionalMarkTime)/float64(delta) > c.fractionalUtilizationGoal {
+               if delta > 0 && float64(pp.gcFractionalMarkTime.Load())/float64(delta) > c.fractionalUtilizationGoal {
                        // Nope. No need to run a fractional worker.
                        gcBgMarkWorkerPool.push(&node.node)
                        return nil, now
index 2b79717703167fdfc05250b4ebe749c6eacdb167..85a9693ace02b8ffa6fbff5f7395e73bdd816fca 100644 (file)
@@ -794,7 +794,7 @@ type p struct {
 
        // Per-P GC state
        gcAssistTime         int64 // Nanoseconds in assistAlloc
-       gcFractionalMarkTime int64 // Nanoseconds in fractional mark worker (atomic)
+       gcFractionalMarkTime atomic.Int64 // Nanoseconds in fractional mark worker
 
        // limiterEvent tracks events for the GC CPU limiter.
        limiterEvent limiterEvent