]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: deduplicate pMask resize code
authorMichael Anthony Knyszek <mknyszek@google.com>
Wed, 3 Sep 2025 19:47:28 +0000 (19:47 +0000)
committerGopher Robot <gobot@golang.org>
Tue, 23 Sep 2025 16:18:09 +0000 (09:18 -0700)
Change-Id: I04a9a69904710a488c685cb9eee9c3313ed8e97b
Reviewed-on: https://go-review.googlesource.com/c/go/+/701896
Reviewed-by: Michael Pratt <mpratt@google.com>
Auto-Submit: Michael Knyszek <mknyszek@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>

src/runtime/proc.go

index 91e1653c7c48d1b322dd3430edfd5f670ef04a29..4154dcd76e4746261683d3224f9c57835f881f69 100644 (file)
@@ -5873,8 +5873,6 @@ func procresize(nprocs int32) *p {
        }
        sched.procresizetime = now
 
-       maskWords := (nprocs + 31) / 32
-
        // Grow allp if necessary.
        if nprocs > int32(len(allp)) {
                // Synchronize with retake, which could be running
@@ -5890,19 +5888,8 @@ func procresize(nprocs int32) *p {
                        allp = nallp
                }
 
-               if maskWords <= int32(cap(idlepMask)) {
-                       idlepMask = idlepMask[:maskWords]
-                       timerpMask = timerpMask[:maskWords]
-               } else {
-                       nidlepMask := make([]uint32, maskWords)
-                       // No need to copy beyond len, old Ps are irrelevant.
-                       copy(nidlepMask, idlepMask)
-                       idlepMask = nidlepMask
-
-                       ntimerpMask := make([]uint32, maskWords)
-                       copy(ntimerpMask, timerpMask)
-                       timerpMask = ntimerpMask
-               }
+               idlepMask = idlepMask.resize(nprocs)
+               timerpMask = timerpMask.resize(nprocs)
                unlock(&allpLock)
        }
 
@@ -5965,8 +5952,8 @@ func procresize(nprocs int32) *p {
        if int32(len(allp)) != nprocs {
                lock(&allpLock)
                allp = allp[:nprocs]
-               idlepMask = idlepMask[:maskWords]
-               timerpMask = timerpMask[:maskWords]
+               idlepMask = idlepMask.resize(nprocs)
+               timerpMask = timerpMask.resize(nprocs)
                unlock(&allpLock)
        }
 
@@ -6905,6 +6892,22 @@ func (p pMask) clear(id int32) {
        atomic.And(&p[word], ^mask)
 }
 
+// resize resizes the pMask and returns a new one.
+//
+// The result may alias p, so callers are encouraged to
+// discard p. Not safe for concurrent use.
+func (p pMask) resize(nprocs int32) pMask {
+       maskWords := (nprocs + 31) / 32
+
+       if maskWords <= int32(cap(p)) {
+               return p[:maskWords]
+       }
+       newMask := make([]uint32, maskWords)
+       // No need to copy beyond len, old Ps are irrelevant.
+       copy(newMask, p)
+       return newMask
+}
+
 // pidleput puts p on the _Pidle list. now must be a relatively recent call
 // to nanotime or zero. Returns now or the current time if now was zero.
 //