]> Cypherpunks repositories - gostls13.git/commit
runtime: incorporate Gscan acquire/release into lock ranking order
authorDan Scales <danscales@google.com>
Wed, 15 Apr 2020 19:35:24 +0000 (12:35 -0700)
committerDan Scales <danscales@google.com>
Thu, 7 May 2020 20:45:42 +0000 (20:45 +0000)
commitf9640b88c7e5f4df3350643f3ec6c30c30e8678d
tree3135a1d5eaa231190acd85f20b2eec0b9b48131c
parent33213039e5d806f93a11561609c804cef7c065b3
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>
src/runtime/lock_futex.go
src/runtime/lock_js.go
src/runtime/lock_sema.go
src/runtime/lockrank.go
src/runtime/lockrank_off.go
src/runtime/lockrank_on.go
src/runtime/proc.go
src/runtime/stack.go