mirror of
https://github.com/golang/go
synced 2024-09-28 20:14:28 -06:00
runtime: donate racectx to g0 in ReadMetricsSlow
ReadMetricsSlow was updated to call the core of readMetrics on the systemstack to prevent issues with stat skew if the stack gets moved between readmemstats_m and readMetrics. However, readMetrics calls into the map implementation, which has race instrumentation. The system stack typically has no racectx set, resulting in crashes. Donate racectx to g0 like the tracer does, so that these accesses don't crash. For #60607. Cq-Include-Trybots: luci.golang.try:gotip-linux-amd64-race Change-Id: Ic0251af2d9b60361f071fe97084508223109480c Reviewed-on: https://go-review.googlesource.com/c/go/+/539695 Reviewed-by: Cherry Mui <cherryyz@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Auto-Submit: Michael Knyszek <mknyszek@google.com>
This commit is contained in:
parent
6a32ecc059
commit
ab79684cdf
@ -425,6 +425,10 @@ func ReadMetricsSlow(memStats *MemStats, samplesp unsafe.Pointer, len, cap int)
|
||||
initMetrics()
|
||||
|
||||
systemstack(func() {
|
||||
// Donate the racectx to g0. readMetricsLocked calls into the race detector
|
||||
// via map access.
|
||||
getg().racectx = getg().m.curg.racectx
|
||||
|
||||
// Read the metrics once before in case it allocates and skews the metrics.
|
||||
// readMetricsLocked is designed to only allocate the first time it is called
|
||||
// with a given slice of samples. In effect, this extra read tests that this
|
||||
@ -442,6 +446,9 @@ func ReadMetricsSlow(memStats *MemStats, samplesp unsafe.Pointer, len, cap int)
|
||||
// system stack with readmemstats_m so that we don't call into
|
||||
// the stack allocator and adjust metrics between there and here.
|
||||
readMetricsLocked(samplesp, len, cap)
|
||||
|
||||
// Undo the donation.
|
||||
getg().racectx = 0
|
||||
})
|
||||
metricsUnlock()
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user