mirror of
https://github.com/golang/go
synced 2024-10-04 15:09:59 +00:00
runtime: make the lock rank DAG make more sense
This groups, comments, and generally reorganizes the lock rank graph description by subsystem. It also introduces several pseudo-nodes that more cleanly describe the inherent layering of lock ranks by subsystem. I believe this doesn't actually change the graph, but haven't verified this. For #53789. Change-Id: I72f332f5a23b8217c7dc1b21411631ad48cee4b0 Reviewed-on: https://go-review.googlesource.com/c/go/+/418718 TryBot-Result: Gopher Robot <gobot@golang.org> Run-TryBot: Austin Clements <austin@google.com> Reviewed-by: Michael Pratt <mpratt@google.com>
This commit is contained in:
parent
d29a0282e9
commit
f42dc0de74
|
@ -12,48 +12,54 @@ const (
|
|||
lockRankUnknown lockRank = iota
|
||||
|
||||
lockRankSysmon
|
||||
lockRankSweepWaiters
|
||||
lockRankAssistQueue
|
||||
lockRankCpuprof
|
||||
lockRankSweep
|
||||
lockRankPollDesc
|
||||
lockRankDeadlock
|
||||
lockRankItab
|
||||
lockRankNotifyList
|
||||
lockRankRoot
|
||||
lockRankRwmutexW
|
||||
lockRankDefer
|
||||
lockRankScavenge
|
||||
lockRankForcegc
|
||||
lockRankDefer
|
||||
lockRankSweepWaiters
|
||||
lockRankAssistQueue
|
||||
lockRankSweep
|
||||
lockRankPollDesc
|
||||
lockRankCpuprof
|
||||
lockRankSched
|
||||
lockRankAllg
|
||||
lockRankAllp
|
||||
lockRankTimers
|
||||
lockRankReflectOffs
|
||||
lockRankNetpollInit
|
||||
lockRankHchan
|
||||
lockRankNotifyList
|
||||
lockRankSudog
|
||||
lockRankRwmutexW
|
||||
lockRankRwmutexR
|
||||
lockRankRoot
|
||||
lockRankItab
|
||||
lockRankReflectOffs
|
||||
// TRACEGLOBAL
|
||||
lockRankTraceBuf
|
||||
lockRankTraceStrings
|
||||
// MALLOC
|
||||
lockRankFin
|
||||
lockRankGcBitsArenas
|
||||
lockRankMheapSpecial
|
||||
lockRankMspanSpecial
|
||||
lockRankSpanSetSpine
|
||||
// MPROF
|
||||
lockRankProfInsert
|
||||
lockRankProfBlock
|
||||
lockRankProfMemActive
|
||||
lockRankGcBitsArenas
|
||||
lockRankSpanSetSpine
|
||||
lockRankMheapSpecial
|
||||
lockRankFin
|
||||
lockRankProfMemFuture
|
||||
// TRACE
|
||||
lockRankTrace
|
||||
lockRankTraceStackTab
|
||||
lockRankNetpollInit
|
||||
lockRankRwmutexR
|
||||
// STACKGROW
|
||||
lockRankGscan
|
||||
lockRankStackpool
|
||||
lockRankStackLarge
|
||||
lockRankHchanLeaf
|
||||
lockRankSudog
|
||||
// WB
|
||||
lockRankWbufSpans
|
||||
lockRankMheap
|
||||
lockRankGlobalAlloc
|
||||
lockRankDeadlock
|
||||
lockRankPanic
|
||||
)
|
||||
|
||||
|
@ -64,48 +70,48 @@ const lockRankLeafRank lockRank = 1000
|
|||
// lockNames gives the names associated with each of the above ranks.
|
||||
var lockNames = []string{
|
||||
lockRankSysmon: "sysmon",
|
||||
lockRankSweepWaiters: "sweepWaiters",
|
||||
lockRankAssistQueue: "assistQueue",
|
||||
lockRankCpuprof: "cpuprof",
|
||||
lockRankSweep: "sweep",
|
||||
lockRankPollDesc: "pollDesc",
|
||||
lockRankDeadlock: "deadlock",
|
||||
lockRankItab: "itab",
|
||||
lockRankNotifyList: "notifyList",
|
||||
lockRankRoot: "root",
|
||||
lockRankRwmutexW: "rwmutexW",
|
||||
lockRankDefer: "defer",
|
||||
lockRankScavenge: "scavenge",
|
||||
lockRankForcegc: "forcegc",
|
||||
lockRankDefer: "defer",
|
||||
lockRankSweepWaiters: "sweepWaiters",
|
||||
lockRankAssistQueue: "assistQueue",
|
||||
lockRankSweep: "sweep",
|
||||
lockRankPollDesc: "pollDesc",
|
||||
lockRankCpuprof: "cpuprof",
|
||||
lockRankSched: "sched",
|
||||
lockRankAllg: "allg",
|
||||
lockRankAllp: "allp",
|
||||
lockRankTimers: "timers",
|
||||
lockRankReflectOffs: "reflectOffs",
|
||||
lockRankNetpollInit: "netpollInit",
|
||||
lockRankHchan: "hchan",
|
||||
lockRankNotifyList: "notifyList",
|
||||
lockRankSudog: "sudog",
|
||||
lockRankRwmutexW: "rwmutexW",
|
||||
lockRankRwmutexR: "rwmutexR",
|
||||
lockRankRoot: "root",
|
||||
lockRankItab: "itab",
|
||||
lockRankReflectOffs: "reflectOffs",
|
||||
lockRankTraceBuf: "traceBuf",
|
||||
lockRankTraceStrings: "traceStrings",
|
||||
lockRankFin: "fin",
|
||||
lockRankGcBitsArenas: "gcBitsArenas",
|
||||
lockRankMheapSpecial: "mheapSpecial",
|
||||
lockRankMspanSpecial: "mspanSpecial",
|
||||
lockRankSpanSetSpine: "spanSetSpine",
|
||||
lockRankProfInsert: "profInsert",
|
||||
lockRankProfBlock: "profBlock",
|
||||
lockRankProfMemActive: "profMemActive",
|
||||
lockRankGcBitsArenas: "gcBitsArenas",
|
||||
lockRankSpanSetSpine: "spanSetSpine",
|
||||
lockRankMheapSpecial: "mheapSpecial",
|
||||
lockRankFin: "fin",
|
||||
lockRankProfMemFuture: "profMemFuture",
|
||||
lockRankTrace: "trace",
|
||||
lockRankTraceStackTab: "traceStackTab",
|
||||
lockRankNetpollInit: "netpollInit",
|
||||
lockRankRwmutexR: "rwmutexR",
|
||||
lockRankGscan: "gscan",
|
||||
lockRankStackpool: "stackpool",
|
||||
lockRankStackLarge: "stackLarge",
|
||||
lockRankHchanLeaf: "hchanLeaf",
|
||||
lockRankSudog: "sudog",
|
||||
lockRankWbufSpans: "wbufSpans",
|
||||
lockRankMheap: "mheap",
|
||||
lockRankGlobalAlloc: "globalAlloc",
|
||||
lockRankDeadlock: "deadlock",
|
||||
lockRankPanic: "panic",
|
||||
}
|
||||
|
||||
|
@ -129,47 +135,47 @@ func (rank lockRank) String() string {
|
|||
// Lock ranks that allow self-cycles list themselves.
|
||||
var lockPartialOrder [][]lockRank = [][]lockRank{
|
||||
lockRankSysmon: {},
|
||||
lockRankSweepWaiters: {},
|
||||
lockRankAssistQueue: {},
|
||||
lockRankCpuprof: {},
|
||||
lockRankSweep: {},
|
||||
lockRankPollDesc: {},
|
||||
lockRankDeadlock: {},
|
||||
lockRankItab: {},
|
||||
lockRankNotifyList: {},
|
||||
lockRankRoot: {},
|
||||
lockRankRwmutexW: {},
|
||||
lockRankDefer: {},
|
||||
lockRankScavenge: {lockRankSysmon},
|
||||
lockRankForcegc: {lockRankSysmon},
|
||||
lockRankSched: {lockRankSysmon, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankPollDesc, lockRankScavenge, lockRankForcegc},
|
||||
lockRankAllg: {lockRankSysmon, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankPollDesc, lockRankScavenge, lockRankForcegc, lockRankSched},
|
||||
lockRankAllp: {lockRankSysmon, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankPollDesc, lockRankScavenge, lockRankForcegc, lockRankSched},
|
||||
lockRankTimers: {lockRankSysmon, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankPollDesc, lockRankScavenge, lockRankForcegc, lockRankSched, lockRankAllp, lockRankTimers},
|
||||
lockRankDefer: {},
|
||||
lockRankSweepWaiters: {},
|
||||
lockRankAssistQueue: {},
|
||||
lockRankSweep: {},
|
||||
lockRankPollDesc: {},
|
||||
lockRankCpuprof: {},
|
||||
lockRankSched: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof},
|
||||
lockRankAllg: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched},
|
||||
lockRankAllp: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched},
|
||||
lockRankTimers: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllp, lockRankTimers},
|
||||
lockRankNetpollInit: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllp, lockRankTimers},
|
||||
lockRankHchan: {lockRankSysmon, lockRankScavenge, lockRankSweep, lockRankHchan},
|
||||
lockRankNotifyList: {},
|
||||
lockRankSudog: {lockRankSysmon, lockRankScavenge, lockRankSweep, lockRankHchan, lockRankNotifyList},
|
||||
lockRankRwmutexW: {},
|
||||
lockRankRwmutexR: {lockRankSysmon, lockRankRwmutexW},
|
||||
lockRankRoot: {},
|
||||
lockRankItab: {},
|
||||
lockRankReflectOffs: {lockRankItab},
|
||||
lockRankHchan: {lockRankSysmon, lockRankSweep, lockRankScavenge, lockRankHchan},
|
||||
lockRankTraceBuf: {lockRankSysmon, lockRankScavenge},
|
||||
lockRankTraceStrings: {lockRankSysmon, lockRankScavenge, lockRankTraceBuf},
|
||||
lockRankMspanSpecial: {lockRankSysmon, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankPollDesc, lockRankItab, lockRankNotifyList, lockRankScavenge, lockRankForcegc, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankReflectOffs, lockRankHchan, lockRankTraceBuf, lockRankTraceStrings},
|
||||
lockRankProfInsert: {lockRankSysmon, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankPollDesc, lockRankItab, lockRankNotifyList, lockRankScavenge, lockRankForcegc, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankReflectOffs, lockRankHchan, lockRankTraceBuf, lockRankTraceStrings},
|
||||
lockRankProfBlock: {lockRankSysmon, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankPollDesc, lockRankItab, lockRankNotifyList, lockRankScavenge, lockRankForcegc, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankReflectOffs, lockRankHchan, lockRankTraceBuf, lockRankTraceStrings},
|
||||
lockRankProfMemActive: {lockRankSysmon, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankPollDesc, lockRankItab, lockRankNotifyList, lockRankScavenge, lockRankForcegc, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankReflectOffs, lockRankHchan, lockRankTraceBuf, lockRankTraceStrings},
|
||||
lockRankGcBitsArenas: {lockRankSysmon, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankPollDesc, lockRankItab, lockRankNotifyList, lockRankScavenge, lockRankForcegc, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankReflectOffs, lockRankHchan, lockRankTraceBuf, lockRankTraceStrings},
|
||||
lockRankSpanSetSpine: {lockRankSysmon, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankPollDesc, lockRankItab, lockRankNotifyList, lockRankScavenge, lockRankForcegc, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankReflectOffs, lockRankHchan, lockRankTraceBuf, lockRankTraceStrings},
|
||||
lockRankMheapSpecial: {lockRankSysmon, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankPollDesc, lockRankItab, lockRankNotifyList, lockRankScavenge, lockRankForcegc, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankReflectOffs, lockRankHchan, lockRankTraceBuf, lockRankTraceStrings},
|
||||
lockRankFin: {lockRankSysmon, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankPollDesc, lockRankItab, lockRankNotifyList, lockRankScavenge, lockRankForcegc, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankReflectOffs, lockRankHchan, lockRankTraceBuf, lockRankTraceStrings},
|
||||
lockRankProfMemFuture: {lockRankSysmon, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankPollDesc, lockRankItab, lockRankNotifyList, lockRankScavenge, lockRankForcegc, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankReflectOffs, lockRankHchan, lockRankTraceBuf, lockRankTraceStrings, lockRankProfMemActive},
|
||||
lockRankTrace: {lockRankSysmon, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankPollDesc, lockRankItab, lockRankNotifyList, lockRankRoot, lockRankScavenge, lockRankForcegc, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankReflectOffs, lockRankHchan, lockRankTraceBuf, lockRankTraceStrings, lockRankFin},
|
||||
lockRankTraceStackTab: {lockRankSysmon, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankPollDesc, lockRankItab, lockRankNotifyList, lockRankRoot, lockRankScavenge, lockRankForcegc, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankReflectOffs, lockRankHchan, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankTrace},
|
||||
lockRankNetpollInit: {lockRankSysmon, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankPollDesc, lockRankScavenge, lockRankForcegc, lockRankSched, lockRankAllp, lockRankTimers},
|
||||
lockRankRwmutexR: {lockRankSysmon, lockRankRwmutexW},
|
||||
lockRankGscan: {lockRankSysmon, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankPollDesc, lockRankItab, lockRankNotifyList, lockRankRoot, lockRankScavenge, lockRankForcegc, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankReflectOffs, lockRankHchan, lockRankTraceBuf, lockRankTraceStrings, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankGcBitsArenas, lockRankSpanSetSpine, lockRankFin, lockRankProfMemFuture, lockRankTrace, lockRankTraceStackTab, lockRankNetpollInit},
|
||||
lockRankStackpool: {lockRankSysmon, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankPollDesc, lockRankItab, lockRankNotifyList, lockRankRoot, lockRankRwmutexW, lockRankScavenge, lockRankForcegc, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankReflectOffs, lockRankHchan, lockRankTraceBuf, lockRankTraceStrings, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankGcBitsArenas, lockRankSpanSetSpine, lockRankFin, lockRankProfMemFuture, lockRankTrace, lockRankTraceStackTab, lockRankNetpollInit, lockRankRwmutexR, lockRankGscan},
|
||||
lockRankStackLarge: {lockRankSysmon, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankPollDesc, lockRankItab, lockRankNotifyList, lockRankRoot, lockRankScavenge, lockRankForcegc, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankReflectOffs, lockRankHchan, lockRankTraceBuf, lockRankTraceStrings, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankGcBitsArenas, lockRankSpanSetSpine, lockRankFin, lockRankProfMemFuture, lockRankTrace, lockRankTraceStackTab, lockRankNetpollInit, lockRankGscan},
|
||||
lockRankHchanLeaf: {lockRankSysmon, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankPollDesc, lockRankItab, lockRankNotifyList, lockRankRoot, lockRankScavenge, lockRankForcegc, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankReflectOffs, lockRankHchan, lockRankTraceBuf, lockRankTraceStrings, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankGcBitsArenas, lockRankSpanSetSpine, lockRankFin, lockRankProfMemFuture, lockRankTrace, lockRankTraceStackTab, lockRankNetpollInit, lockRankGscan, lockRankHchanLeaf},
|
||||
lockRankSudog: {lockRankSysmon, lockRankSweep, lockRankNotifyList, lockRankScavenge, lockRankHchan},
|
||||
lockRankWbufSpans: {lockRankSysmon, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankPollDesc, lockRankItab, lockRankNotifyList, lockRankRoot, lockRankDefer, lockRankScavenge, lockRankForcegc, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankReflectOffs, lockRankHchan, lockRankTraceBuf, lockRankTraceStrings, lockRankMspanSpecial, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankGcBitsArenas, lockRankSpanSetSpine, lockRankFin, lockRankProfMemFuture, lockRankTrace, lockRankTraceStackTab, lockRankNetpollInit, lockRankGscan, lockRankSudog},
|
||||
lockRankMheap: {lockRankSysmon, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankPollDesc, lockRankItab, lockRankNotifyList, lockRankRoot, lockRankRwmutexW, lockRankDefer, lockRankScavenge, lockRankForcegc, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankReflectOffs, lockRankHchan, lockRankTraceBuf, lockRankTraceStrings, lockRankMspanSpecial, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankGcBitsArenas, lockRankSpanSetSpine, lockRankFin, lockRankProfMemFuture, lockRankTrace, lockRankTraceStackTab, lockRankNetpollInit, lockRankRwmutexR, lockRankGscan, lockRankStackpool, lockRankStackLarge, lockRankSudog, lockRankWbufSpans},
|
||||
lockRankGlobalAlloc: {lockRankSysmon, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankPollDesc, lockRankItab, lockRankNotifyList, lockRankRoot, lockRankRwmutexW, lockRankDefer, lockRankScavenge, lockRankForcegc, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankReflectOffs, lockRankHchan, lockRankTraceBuf, lockRankTraceStrings, lockRankMspanSpecial, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankGcBitsArenas, lockRankSpanSetSpine, lockRankMheapSpecial, lockRankFin, lockRankProfMemFuture, lockRankTrace, lockRankTraceStackTab, lockRankNetpollInit, lockRankRwmutexR, lockRankGscan, lockRankStackpool, lockRankStackLarge, lockRankSudog, lockRankWbufSpans, lockRankMheap},
|
||||
lockRankFin: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankHchan, lockRankNotifyList, lockRankItab, lockRankReflectOffs, lockRankTraceBuf, lockRankTraceStrings},
|
||||
lockRankGcBitsArenas: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankHchan, lockRankNotifyList, lockRankItab, lockRankReflectOffs, lockRankTraceBuf, lockRankTraceStrings},
|
||||
lockRankMheapSpecial: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankHchan, lockRankNotifyList, lockRankItab, lockRankReflectOffs, lockRankTraceBuf, lockRankTraceStrings},
|
||||
lockRankMspanSpecial: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankHchan, lockRankNotifyList, lockRankItab, lockRankReflectOffs, lockRankTraceBuf, lockRankTraceStrings},
|
||||
lockRankSpanSetSpine: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankHchan, lockRankNotifyList, lockRankItab, lockRankReflectOffs, lockRankTraceBuf, lockRankTraceStrings},
|
||||
lockRankProfInsert: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankHchan, lockRankNotifyList, lockRankItab, lockRankReflectOffs, lockRankTraceBuf, lockRankTraceStrings},
|
||||
lockRankProfBlock: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankHchan, lockRankNotifyList, lockRankItab, lockRankReflectOffs, lockRankTraceBuf, lockRankTraceStrings},
|
||||
lockRankProfMemActive: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankHchan, lockRankNotifyList, lockRankItab, lockRankReflectOffs, lockRankTraceBuf, lockRankTraceStrings},
|
||||
lockRankProfMemFuture: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankHchan, lockRankNotifyList, lockRankItab, lockRankReflectOffs, lockRankTraceBuf, lockRankTraceStrings, lockRankProfMemActive},
|
||||
lockRankTrace: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankHchan, lockRankNotifyList, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankTraceBuf, lockRankTraceStrings, lockRankFin},
|
||||
lockRankTraceStackTab: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankHchan, lockRankNotifyList, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankTrace},
|
||||
lockRankGscan: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankNetpollInit, lockRankHchan, lockRankNotifyList, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankGcBitsArenas, lockRankSpanSetSpine, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankTrace, lockRankTraceStackTab},
|
||||
lockRankStackpool: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankNetpollInit, lockRankHchan, lockRankNotifyList, lockRankRwmutexW, lockRankRwmutexR, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankGcBitsArenas, lockRankSpanSetSpine, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankTrace, lockRankTraceStackTab, lockRankGscan},
|
||||
lockRankStackLarge: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankNetpollInit, lockRankHchan, lockRankNotifyList, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankGcBitsArenas, lockRankSpanSetSpine, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankTrace, lockRankTraceStackTab, lockRankGscan},
|
||||
lockRankHchanLeaf: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankNetpollInit, lockRankHchan, lockRankNotifyList, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankGcBitsArenas, lockRankSpanSetSpine, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankTrace, lockRankTraceStackTab, lockRankGscan, lockRankHchanLeaf},
|
||||
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},
|
||||
}
|
||||
|
|
|
@ -32,42 +32,144 @@ import (
|
|||
// lock, which means no other lock can be acquired while it is held.
|
||||
// Therefore, leaf locks do not need to be given an explicit rank.
|
||||
//
|
||||
// Ranks in all caps are pseudo-nodes that help define order, but do
|
||||
// not actually define a rank.
|
||||
//
|
||||
// TODO: It's often hard to correlate rank names to locks. Change
|
||||
// these to be more consistent with the locks they label.
|
||||
const ranks = `
|
||||
NONE < sysmon, sweepWaiters, assistQueue, cpuprof, sweep, pollDesc, deadlock, itab, notifyList, root, rwmutexW, defer;
|
||||
sysmon < scavenge, forcegc;
|
||||
assistQueue, cpuprof, forcegc, pollDesc, scavenge, sweep, sweepWaiters < sched;
|
||||
# Sysmon
|
||||
NONE
|
||||
< sysmon
|
||||
< scavenge, forcegc;
|
||||
|
||||
# Defer
|
||||
NONE < defer;
|
||||
|
||||
# GC
|
||||
NONE <
|
||||
sweepWaiters,
|
||||
assistQueue,
|
||||
sweep;
|
||||
|
||||
# Scheduler, timers, netpoll
|
||||
NONE < pollDesc, cpuprof;
|
||||
assistQueue,
|
||||
cpuprof,
|
||||
forcegc,
|
||||
pollDesc, # pollDesc can interact with timers, which can lock sched.
|
||||
scavenge,
|
||||
sweep,
|
||||
sweepWaiters
|
||||
< sched;
|
||||
sched < allg, allp;
|
||||
allp < timers;
|
||||
itab < reflectOffs;
|
||||
scavenge, sweep < hchan;
|
||||
scavenge < traceBuf;
|
||||
traceBuf < traceStrings;
|
||||
allg, hchan, notifyList, reflectOffs, timers, traceStrings < mspanSpecial, profInsert, profBlock, profMemActive, gcBitsArenas, spanSetSpine, mheapSpecial, fin;
|
||||
profMemActive < profMemFuture;
|
||||
hchan, root, sched, traceStrings, notifyList, fin < trace;
|
||||
trace < traceStackTab;
|
||||
timers < netpollInit;
|
||||
|
||||
# Channels
|
||||
scavenge, sweep < hchan;
|
||||
NONE < notifyList;
|
||||
hchan, notifyList < sudog;
|
||||
|
||||
# RWMutex
|
||||
NONE < rwmutexW;
|
||||
rwmutexW, sysmon < rwmutexR;
|
||||
gcBitsArenas, netpollInit, profBlock, profInsert, profMemFuture, spanSetSpine, traceStackTab < gscan;
|
||||
|
||||
# Semaphores
|
||||
NONE < root;
|
||||
|
||||
# Itabs
|
||||
NONE
|
||||
< itab
|
||||
< reflectOffs;
|
||||
|
||||
# Tracing without a P uses a global trace buffer.
|
||||
scavenge
|
||||
# Above TRACEGLOBAL can emit a trace event without a P.
|
||||
< TRACEGLOBAL
|
||||
# Below TRACEGLOBAL manages the global tracing buffer.
|
||||
# Note that traceBuf eventually chains to MALLOC, but we never get that far
|
||||
# in the situation where there's no P.
|
||||
< traceBuf;
|
||||
# Starting/stopping tracing traces strings.
|
||||
traceBuf < traceStrings;
|
||||
|
||||
# Malloc
|
||||
allg,
|
||||
hchan,
|
||||
notifyList,
|
||||
reflectOffs,
|
||||
timers,
|
||||
traceStrings
|
||||
# Above MALLOC are things that can allocate memory.
|
||||
< MALLOC
|
||||
# Below MALLOC is the malloc implementation.
|
||||
< fin,
|
||||
gcBitsArenas,
|
||||
mheapSpecial,
|
||||
mspanSpecial,
|
||||
spanSetSpine,
|
||||
MPROF;
|
||||
|
||||
# Memory profiling
|
||||
MPROF < profInsert, profBlock, profMemActive;
|
||||
profMemActive < profMemFuture;
|
||||
|
||||
# Execution tracer events (with a P)
|
||||
hchan,
|
||||
root,
|
||||
sched,
|
||||
traceStrings,
|
||||
notifyList,
|
||||
fin
|
||||
# Above TRACE is anything that can create a trace event
|
||||
< TRACE
|
||||
< trace
|
||||
< traceStackTab;
|
||||
|
||||
# Stack allocation and copying
|
||||
gcBitsArenas,
|
||||
netpollInit,
|
||||
profBlock,
|
||||
profInsert,
|
||||
profMemFuture,
|
||||
spanSetSpine,
|
||||
traceStackTab
|
||||
# Anything that can grow the stack can acquire STACKGROW.
|
||||
# (Most higher layers imply STACKGROW, like MALLOC.)
|
||||
< STACKGROW
|
||||
# Below STACKGROW is the stack allocator/copying implementation.
|
||||
< gscan;
|
||||
gscan, rwmutexR < stackpool;
|
||||
gscan < stackLarge;
|
||||
|
||||
# Generally, hchan must be acquired before gscan. But in one specific
|
||||
# case (in syncadjustsudogs from markroot after the g has been suspended
|
||||
# by suspendG), we allow gscan to be acquired, and then an hchan lock. To
|
||||
# allow this case, we use this hchanLeaf rank in syncadjustsudogs(),
|
||||
# rather than hchan. By using this special rank, we don't allow any further
|
||||
# locks to be acquired other than more hchan locks.
|
||||
# Generally, hchan must be acquired before gscan. But in one case,
|
||||
# where we suspend a G and then shrink its stack, syncadjustsudogs
|
||||
# can acquire hchan locks while holding gscan. To allow this case,
|
||||
# we use hchanLeaf instead of hchan.
|
||||
gscan < hchanLeaf;
|
||||
|
||||
hchan, notifyList < sudog;
|
||||
defer, gscan, mspanSpecial, sudog < wbufSpans;
|
||||
stackLarge, stackpool, wbufSpans < mheap;
|
||||
# Write barrier
|
||||
defer,
|
||||
gscan,
|
||||
mspanSpecial,
|
||||
sudog
|
||||
# Anything that can have write barriers can acquire WB.
|
||||
# Above WB, we can have write barriers.
|
||||
< WB
|
||||
# Below WB is the write barrier implementation.
|
||||
< wbufSpans;
|
||||
|
||||
# Span allocator
|
||||
stackLarge,
|
||||
stackpool,
|
||||
wbufSpans
|
||||
# Above mheap is anything that can call the span allocator.
|
||||
< mheap;
|
||||
# Below mheap is the span allocator implementation.
|
||||
mheap, mheapSpecial < globalAlloc;
|
||||
|
||||
# panic is handled specially. It is implicitly below all other locks.
|
||||
NONE < deadlock;
|
||||
deadlock < panic;
|
||||
`
|
||||
|
||||
|
@ -158,8 +260,12 @@ const (
|
|||
|
||||
`)
|
||||
for _, rank := range topo {
|
||||
if isPseudo(rank) {
|
||||
fmt.Fprintf(w, "\t// %s\n", rank)
|
||||
} else {
|
||||
fmt.Fprintf(w, "\t%s\n", cname(rank))
|
||||
}
|
||||
}
|
||||
fmt.Fprintf(w, `)
|
||||
|
||||
// lockRankLeafRank is the rank of lock that does not have a declared rank,
|
||||
|
@ -173,8 +279,10 @@ const lockRankLeafRank lockRank = 1000
|
|||
var lockNames = []string{
|
||||
`)
|
||||
for _, rank := range topo {
|
||||
if !isPseudo(rank) {
|
||||
fmt.Fprintf(w, "\t%s: %q,\n", cname(rank), rank)
|
||||
}
|
||||
}
|
||||
fmt.Fprintf(w, `}
|
||||
|
||||
func (rank lockRank) String() string {
|
||||
|
@ -201,10 +309,15 @@ func (rank lockRank) String() string {
|
|||
var lockPartialOrder [][]lockRank = [][]lockRank{
|
||||
`)
|
||||
for _, rank := range topo {
|
||||
if isPseudo(rank) {
|
||||
continue
|
||||
}
|
||||
list := []string{}
|
||||
for _, before := range g.Edges(rank) {
|
||||
if !isPseudo(before) {
|
||||
list = append(list, cname(before))
|
||||
}
|
||||
}
|
||||
if cyclicRanks[rank] {
|
||||
list = append(list, cname(rank))
|
||||
}
|
||||
|
@ -219,6 +332,10 @@ func cname(label string) string {
|
|||
return "lockRank" + strings.ToUpper(label[:1]) + label[1:]
|
||||
}
|
||||
|
||||
func isPseudo(label string) bool {
|
||||
return strings.ToUpper(label) == label
|
||||
}
|
||||
|
||||
// generateDot emits a Graphviz dot representation of g to w.
|
||||
func generateDot(w io.Writer, g *dag.Graph) {
|
||||
fmt.Fprintf(w, "digraph g {\n")
|
||||
|
|
Loading…
Reference in a new issue