mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
runtime: incorporate Gscan acquire/release into lock ranking order
I added routines that can acquire/release a particular rank without acquiring/releasing an associated lock. I added lockRankGscan as a rank for acquiring/releasing the Gscan bit. castogscanstatus() and casGtoPreemptScan() are acquires of the Gscan bit. casfrom_Gscanstatus() is a release of the Gscan bit. casgstatus() is like an acquire and release of the Gscan bit, since it will wait if Gscan bit is currently set. We have a cycle between hchan and Gscan. The acquisition of Gscan and then hchan only happens in syncadjustsudogs() when the G is suspended, so the main normal ordering (get hchan, then get Gscan) can't be happening. So, I added a new rank lockRankHchanLeaf that is used when acquiring hchan locks in syncadjustsudogs. This ranking is set so no other locks can be acquired except other hchan locks. Fixes #38922 Change-Id: I58ce526a74ba856cb42078f7b9901f2832e1d45c Reviewed-on: https://go-review.googlesource.com/c/go/+/228417 Run-TryBot: Dan Scales <danscales@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Austin Clements <austin@google.com>
This commit is contained in:
parent
33213039e5
commit
f9640b88c7
8 changed files with 130 additions and 42 deletions
|
|
@ -794,7 +794,16 @@ func syncadjustsudogs(gp *g, used uintptr, adjinfo *adjustinfo) uintptr {
|
|||
var lastc *hchan
|
||||
for sg := gp.waiting; sg != nil; sg = sg.waitlink {
|
||||
if sg.c != lastc {
|
||||
lock(&sg.c.lock)
|
||||
// There is a ranking cycle here between gscan bit and
|
||||
// hchan locks. Normally, we only allow acquiring hchan
|
||||
// locks and then getting a gscan bit. In this case, we
|
||||
// already have the gscan bit. We allow acquiring hchan
|
||||
// locks here as a special case, since a deadlock can't
|
||||
// happen because the G involved must already be
|
||||
// suspended. So, we get a special hchan lock rank here
|
||||
// that is lower than gscan, but doesn't allow acquiring
|
||||
// any other locks other than hchan.
|
||||
lockWithRank(&sg.c.lock, lockRankHchanLeaf)
|
||||
}
|
||||
lastc = sg.c
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue