diff options
author | Ian Lance Taylor <iant@golang.org> | 2019-12-02 12:07:22 -0800 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2019-12-02 22:42:22 +0000 |
commit | 94f4686a77d1d708f240eac388fb5c5b83e2c15f (patch) | |
tree | 3aa8fda7bd9c252db61259ce181ab1cd71a60ebc /src/runtime/time.go | |
parent | a18608a044afed86c789e541db65526b9ccacef9 (diff) | |
download | go-94f4686a77d1d708f240eac388fb5c5b83e2c15f.tar.gz go-94f4686a77d1d708f240eac388fb5c5b83e2c15f.zip |
runtime: use current P's race context in timer code
We were using the race context of the P that held the timer,
but since we unlock the P's timers while executing a timer
that could lead to a race on the race context itself.
Updates #6239
Updates #27707
Fixes #35906
Change-Id: I5f9d5f52d8e28dffb88c3327301071b16ed1a913
Reviewed-on: https://go-review.googlesource.com/c/go/+/209580
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
Diffstat (limited to 'src/runtime/time.go')
-rw-r--r-- | src/runtime/time.go | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/src/runtime/time.go b/src/runtime/time.go index a7d14cf877..d64bea814f 100644 --- a/src/runtime/time.go +++ b/src/runtime/time.go @@ -805,10 +805,11 @@ func runtimer(pp *p, now int64) int64 { //go:systemstack func runOneTimer(pp *p, t *timer, now int64) { if raceenabled { - if pp.timerRaceCtx == 0 { - pp.timerRaceCtx = racegostart(funcPC(runtimer) + sys.PCQuantum) + ppcur := getg().m.p.ptr() + if ppcur.timerRaceCtx == 0 { + ppcur.timerRaceCtx = racegostart(funcPC(runtimer) + sys.PCQuantum) } - raceacquirectx(pp.timerRaceCtx, unsafe.Pointer(t)) + raceacquirectx(ppcur.timerRaceCtx, unsafe.Pointer(t)) } f := t.f @@ -836,12 +837,12 @@ func runOneTimer(pp *p, t *timer, now int64) { } if raceenabled { - // Temporarily use the P's racectx for g0. + // Temporarily use the current P's racectx for g0. gp := getg() if gp.racectx != 0 { throw("runOneTimer: unexpected racectx") } - gp.racectx = pp.timerRaceCtx + gp.racectx = gp.m.p.ptr().timerRaceCtx } unlock(&pp.timersLock) |