diff options
| author | Michael Anthony Knyszek <mknyszek@google.com> | 2025-09-03 19:47:28 +0000 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2025-09-23 09:18:09 -0700 |
| commit | 69e74b0aacc1de59b618bbb9789a2e7e0cd806b5 (patch) | |
| tree | f2a127e5c2c49e79f2d86911120a3eeb1ad9b3d4 /src/runtime | |
| parent | fde10c4ce7f3b32acd886992450dd94cafb699a4 (diff) | |
| download | go-69e74b0aacc1de59b618bbb9789a2e7e0cd806b5.tar.xz | |
runtime: deduplicate pMask resize code
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>
Diffstat (limited to 'src/runtime')
| -rw-r--r-- | src/runtime/proc.go | 37 |
1 files changed, 20 insertions, 17 deletions
diff --git a/src/runtime/proc.go b/src/runtime/proc.go index 91e1653c7c..4154dcd76e 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -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. // |
