From 226346bb763233ed9341bc1d829752628479845f Mon Sep 17 00:00:00 2001 From: Michael Anthony Knyszek Date: Thu, 21 Apr 2022 22:18:31 +0000 Subject: [PATCH] runtime: yield instead of sleeping in runqgrab on OpenBSD OpenBSD has a coarse sleep granularity that rounds up to 10 ms increments. This can cause significant STW delays, among other issues. As far as I can tell, there's only 1 tightly timed sleep without an explicit wakeup for which this actually matters. Fixes #52475. Change-Id: Ic69fc11096ddbbafd79b2dcdf3f912fde242db24 Reviewed-on: https://go-review.googlesource.com/c/go/+/401638 Reviewed-by: Matthew Dempsky Reviewed-by: Michael Pratt Run-TryBot: Michael Knyszek TryBot-Result: Gopher Robot --- src/runtime/proc.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/runtime/proc.go b/src/runtime/proc.go index b281d9f3b8a..96d44efdddf 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -5904,10 +5904,10 @@ func runqgrab(_p_ *p, batch *[256]guintptr, batchHead uint32, stealRunNextG bool // between different Ps. // A sync chan send/recv takes ~50ns as of time of // writing, so 3us gives ~50x overshoot. - if GOOS != "windows" { + if GOOS != "windows" && GOOS != "openbsd" { usleep(3) } else { - // On windows system timer granularity is + // On some platforms system timer granularity is // 1-15ms, which is way too much for this // optimization. So just yield. osyield()