]> Cypherpunks repositories - gostls13.git/commit
[dev.simd] runtime: remove write barrier in xRegRestore
authorAustin Clements <austin@google.com>
Mon, 30 Jun 2025 20:42:19 +0000 (16:42 -0400)
committerGopher Robot <gobot@golang.org>
Mon, 30 Jun 2025 21:41:26 +0000 (14:41 -0700)
commit0710cce6eb0d75db1fc6c45807773f40edb14d73
tree02e25225e95b6ccd142467e2ffdbd05c8db36bda
parent59846af331228b28e69326412011b26b62f0c74d
[dev.simd] runtime: remove write barrier in xRegRestore

Currently, there's a write barrier in xRegRestore when it assigns
pp.xRegs.cache = gp.xRegs.state. This is bad because that gets called
on the asyncPreempt return path, where we have really limited stack
space, and we don't currently account for this write barrier.

We can't simply mark xRegState as sys.NotInHeap because it's also
embedded in runtime.p as register scratch space, and runtime.p is heap
allocated.

Hence, to fix this, we rename xRegState to just "xRegs" and introduce
a wrapper "xRegState" type that embeds xRegs and is itself marked
sys.NotInHeap. Then, anywhere we need a manually-managed pointer to
register state, we use the new type.

To ensure this doesn't happen again in the future, we also mark
asyncPreempt2 as go:nowritebarrierrec.

Change-Id: I5ff4841e55ff20047ff7d253ab659ab77aeb3391
Reviewed-on: https://go-review.googlesource.com/c/go/+/684836
Auto-Submit: Austin Clements <austin@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
src/runtime/mkpreempt.go
src/runtime/preempt.go
src/runtime/preempt_amd64.go
src/runtime/preempt_xreg.go