]> Cypherpunks repositories - gostls13.git/commit
runtime: fix timers.wakeTime inaccuracy race
authorRuss Cox <rsc@golang.org>
Fri, 16 Feb 2024 22:56:43 +0000 (17:56 -0500)
committerGopher Robot <gobot@golang.org>
Fri, 8 Mar 2024 21:09:41 +0000 (21:09 +0000)
commit85bbb121413b5fe49238b2e089975f8b50b30de0
tree2083eba5e21385a76498067f0edc447f8ccc89ee
parent3ad5cd4741e438410d57f622e27b69e7e2809042
runtime: fix timers.wakeTime inaccuracy race

timers.wakeTime, which is called concurrently by P's trying to decide
how long they should sleep, can return inaccurate values while
timers.adjust is running. (Before the refactoring, this was still true
but the code did not have good names and was spread across more
files, making the race harder to see.)

The runtime thread sleeping code is complex enough that I am not
confident that the inaccuracy can cause delayed timer wakeups,
but I am also not confident that it can't, nor that it won't in the future.

There are two parts to the fix:

1. A simple logic change in timers.adjust.

2. The introduction of t.maybeAdd to avoid having a t that is
marked as belonging to a specific timers ts but not present
in ts.heap. That was okay before when everything was racy
but needs to be eliminated to make timers.adjust fully consistent.
The cost of the change is an extra CAS-lock operation on a timer add
(close to free since the CAS-lock was just unlocked) and a change
in the static lock ranking to allow malloc while holding a timer lock.

Change-Id: I1249e6e24ae9ef74a69837f453e15b513f0d75c0
Reviewed-on: https://go-review.googlesource.com/c/go/+/564977
Reviewed-by: Austin Clements <austin@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Auto-Submit: Russ Cox <rsc@golang.org>
src/runtime/lockrank.go
src/runtime/mklockrank.go
src/runtime/time.go