From: Lucien Coffe Date: Fri, 21 Apr 2023 15:20:19 +0000 (+0200) Subject: runtime: prevent double lock in checkdead by unlocking before throws X-Git-Tag: go1.21rc1~805 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=f229787affbcaafb55dac2ceae65282b172e253a;p=gostls13.git runtime: prevent double lock in checkdead by unlocking before throws This change resolves an issue where checkdead could result in a double lock when shedtrace is enabled. This fix involves adding unlocks before all throws in the checkdead function to ensure the scheduler lock is properly released. Fixes #59758 Change-Id: If3ddf9969f4582c3c88dee9b9ecc355a63958103 Reviewed-on: https://go-review.googlesource.com/c/go/+/487375 Run-TryBot: Michael Pratt TryBot-Result: Gopher Robot Reviewed-by: Michael Knyszek Auto-Submit: Michael Pratt Reviewed-by: Michael Pratt --- diff --git a/src/runtime/proc.go b/src/runtime/proc.go index 23d760bf84..fdbf888c4f 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -5194,6 +5194,7 @@ func checkdead() { } if run < 0 { print("runtime: checkdead: nmidle=", sched.nmidle, " nmidlelocked=", sched.nmidlelocked, " mcount=", mcount(), " nmsys=", sched.nmsys, "\n") + unlock(&sched.lock) throw("checkdead: inconsistent counts") } @@ -5211,6 +5212,7 @@ func checkdead() { _Grunning, _Gsyscall: print("runtime: checkdead: find g ", gp.goid, " in status ", s, "\n") + unlock(&sched.lock) throw("checkdead: runnable g") } }) @@ -5229,12 +5231,14 @@ func checkdead() { if pp == nil { // There should always be a free P since // nothing is running. + unlock(&sched.lock) throw("checkdead: no p for timer") } mp := mget() if mp == nil { // There should always be a free M since // nothing is running. + unlock(&sched.lock) throw("checkdead: no m for timer") } // M must be spinning to steal. We set this to be