diff --git a/src/runtime/lockrank.go b/src/runtime/lockrank.go index b3c01ba104..23b727f4d8 100644 --- a/src/runtime/lockrank.go +++ b/src/runtime/lockrank.go @@ -44,7 +44,6 @@ const ( lockRankPollDesc lockRankSched lockRankDeadlock - lockRankPanic lockRankAllg lockRankAllp @@ -92,6 +91,7 @@ const ( // rank, we don't allow any further locks to be acquired other than more // hchan locks. lockRankHchanLeaf + lockRankPanic // Leaf locks with no dependencies, so these constants are not actually used anywhere. // There are other architecture-dependent leaf locks as well. @@ -123,7 +123,6 @@ var lockNames = []string{ lockRankPollDesc: "pollDesc", lockRankSched: "sched", lockRankDeadlock: "deadlock", - lockRankPanic: "panic", lockRankAllg: "allg", lockRankAllp: "allp", @@ -162,6 +161,7 @@ var lockNames = []string{ lockRankGFree: "gFree", lockRankHchanLeaf: "hchanLeaf", + lockRankPanic: "panic", lockRankNewmHandoff: "newmHandoff.lock", lockRankDebugPtrmask: "debugPtrmask.lock", @@ -202,8 +202,7 @@ var lockPartialOrder [][]lockRank = [][]lockRank{ lockRankPollDesc: {}, lockRankSched: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankPollDesc}, lockRankDeadlock: {lockRankDeadlock}, - lockRankPanic: {lockRankDeadlock}, - lockRankAllg: {lockRankSysmon, lockRankSched, lockRankPanic}, + lockRankAllg: {lockRankSysmon, lockRankSched}, lockRankAllp: {lockRankSysmon, lockRankSched}, lockRankTimers: {lockRankSysmon, lockRankScavenge, lockRankSched, lockRankAllp, lockRankPollDesc, lockRankTimers}, lockRankItab: {}, @@ -237,6 +236,7 @@ var lockPartialOrder [][]lockRank = [][]lockRank{ lockRankGFree: {lockRankSched}, lockRankHchanLeaf: {lockRankGscan, lockRankHchanLeaf}, + lockRankPanic: {lockRankDeadlock}, // plus any other lock held on throw. lockRankNewmHandoff: {}, lockRankDebugPtrmask: {}, diff --git a/src/runtime/lockrank_on.go b/src/runtime/lockrank_on.go index 7d45debaca..3958d9eeaa 100644 --- a/src/runtime/lockrank_on.go +++ b/src/runtime/lockrank_on.go @@ -65,12 +65,11 @@ func lockWithRank(l *mutex, rank lockRank) { // rank recording for it, since print/println are used when // printing out a lock ordering problem below. // - // paniclk has an ordering problem, since it can be acquired - // during a panic with any other locks held (especially if the - // panic is because of a directed segv), and yet also allg is - // acquired after paniclk in tracebackothers()). This is a genuine - // problem, so for now we don't do lock rank recording for paniclk - // either. + // paniclk is only used for fatal throw/panic. Don't do lock + // ranking recording for it, since we throw after reporting a + // lock ordering problem. Additionally, paniclk may be taken + // after effectively any lock (anywhere we might panic), which + // the partial order doesn't cover. lock2(l) return }