]> Cypherpunks.ru repositories - gostls13.git/commitdiff
runtime: clean up panic and deadlock lock ranks
authorAustin Clements <austin@google.com>
Wed, 20 Jul 2022 21:44:45 +0000 (17:44 -0400)
committerAustin Clements <austin@google.com>
Thu, 4 Aug 2022 15:31:49 +0000 (15:31 +0000)
I'm not entirely sure why these locks are currently ranked "deadlock <
panic" since we drop panic before acquiring deadlock, and we actually
want deadlock to be below panic because panic is implicitly below
everything else and we want deadlock to be, too. My best guess is that
we had this edge because we intentionally acquire deadlock twice to
deadlock, and that causes the lock rank checking to panic on the
second acquire.

Fix this in a more sensible way by capturing that deadlock can be
acquired in a self-cycle and flipping the rank to "panic < deadlock"
to express that deadlock needs to be under all other locks, just like
panic.

For #53789.

Change-Id: I8809e5d102ce473bd3ace0ba07bf2200ef60263f
Reviewed-on: https://go-review.googlesource.com/c/go/+/418719
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Michael Pratt <mpratt@google.com>
Run-TryBot: Austin Clements <austin@google.com>

src/runtime/lockrank.go
src/runtime/mklockrank.go

index 83d1ac3f0b9b504060c5728bbe9c6613c5c1e312..50d35dbc57fb1fb173464b996b06c1bae7d5cefb 100644 (file)
@@ -59,8 +59,8 @@ const (
        lockRankWbufSpans
        lockRankMheap
        lockRankGlobalAlloc
-       lockRankDeadlock
        lockRankPanic
+       lockRankDeadlock
 )
 
 // lockRankLeafRank is the rank of lock that does not have a declared rank,
@@ -111,8 +111,8 @@ var lockNames = []string{
        lockRankWbufSpans:     "wbufSpans",
        lockRankMheap:         "mheap",
        lockRankGlobalAlloc:   "globalAlloc",
-       lockRankDeadlock:      "deadlock",
        lockRankPanic:         "panic",
+       lockRankDeadlock:      "deadlock",
 }
 
 func (rank lockRank) String() string {
@@ -176,6 +176,6 @@ var lockPartialOrder [][]lockRank = [][]lockRank{
        lockRankWbufSpans:     {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankDefer, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankNetpollInit, lockRankHchan, lockRankNotifyList, lockRankSudog, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankGcBitsArenas, lockRankMspanSpecial, lockRankSpanSetSpine, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankTrace, lockRankTraceStackTab, lockRankGscan},
        lockRankMheap:         {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankDefer, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankNetpollInit, lockRankHchan, lockRankNotifyList, lockRankSudog, lockRankRwmutexW, lockRankRwmutexR, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankGcBitsArenas, lockRankMspanSpecial, lockRankSpanSetSpine, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankTrace, lockRankTraceStackTab, lockRankGscan, lockRankStackpool, lockRankStackLarge, lockRankWbufSpans},
        lockRankGlobalAlloc:   {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankDefer, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankNetpollInit, lockRankHchan, lockRankNotifyList, lockRankSudog, lockRankRwmutexW, lockRankRwmutexR, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankGcBitsArenas, lockRankMheapSpecial, lockRankMspanSpecial, lockRankSpanSetSpine, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankTrace, lockRankTraceStackTab, lockRankGscan, lockRankStackpool, lockRankStackLarge, lockRankWbufSpans, lockRankMheap},
-       lockRankDeadlock:      {},
-       lockRankPanic:         {lockRankDeadlock},
+       lockRankPanic:         {},
+       lockRankDeadlock:      {lockRankPanic, lockRankDeadlock},
 }
index fc7c0223e45ed43dda6434459723f9f037560548..0d50d60a2284f3ce59cf3842282055e18843245a 100644 (file)
@@ -169,8 +169,10 @@ stackLarge,
 mheap, mheapSpecial < globalAlloc;
 
 # panic is handled specially. It is implicitly below all other locks.
-NONE < deadlock;
-deadlock < panic;
+NONE < panic;
+# deadlock is not acquired while holding panic, but it also needs to be
+# below all other locks.
+panic < deadlock;
 `
 
 // cyclicRanks lists lock ranks that allow multiple locks of the same
@@ -185,6 +187,8 @@ var cyclicRanks = map[string]bool{
        // Multiple hchanLeafs are acquired in hchan.sortkey() order in
        // syncadjustsudogs().
        "hchanLeaf": true,
+       // The point of the deadlock lock is to deadlock.
+       "deadlock": true,
 }
 
 func main() {