mirror of
https://github.com/golang/go
synced 2024-09-15 22:20:06 +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
|
lockRankUnknown lockRank = iota
|
||||||
|
|
||||||
lockRankSysmon
|
lockRankSysmon
|
||||||
lockRankSweepWaiters
|
|
||||||
lockRankAssistQueue
|
|
||||||
lockRankCpuprof
|
|
||||||
lockRankSweep
|
|
||||||
lockRankPollDesc
|
|
||||||
lockRankDeadlock
|
|
||||||
lockRankItab
|
|
||||||
lockRankNotifyList
|
|
||||||
lockRankRoot
|
|
||||||
lockRankRwmutexW
|
|
||||||
lockRankDefer
|
|
||||||
lockRankScavenge
|
lockRankScavenge
|
||||||
lockRankForcegc
|
lockRankForcegc
|
||||||
|
lockRankDefer
|
||||||
|
lockRankSweepWaiters
|
||||||
|
lockRankAssistQueue
|
||||||
|
lockRankSweep
|
||||||
|
lockRankPollDesc
|
||||||
|
lockRankCpuprof
|
||||||
lockRankSched
|
lockRankSched
|
||||||
lockRankAllg
|
lockRankAllg
|
||||||
lockRankAllp
|
lockRankAllp
|
||||||
lockRankTimers
|
lockRankTimers
|
||||||
lockRankReflectOffs
|
lockRankNetpollInit
|
||||||
lockRankHchan
|
lockRankHchan
|
||||||
|
lockRankNotifyList
|
||||||
|
lockRankSudog
|
||||||
|
lockRankRwmutexW
|
||||||
|
lockRankRwmutexR
|
||||||
|
lockRankRoot
|
||||||
|
lockRankItab
|
||||||
|
lockRankReflectOffs
|
||||||
|
// TRACEGLOBAL
|
||||||
lockRankTraceBuf
|
lockRankTraceBuf
|
||||||
lockRankTraceStrings
|
lockRankTraceStrings
|
||||||
|
// MALLOC
|
||||||
|
lockRankFin
|
||||||
|
lockRankGcBitsArenas
|
||||||
|
lockRankMheapSpecial
|
||||||
lockRankMspanSpecial
|
lockRankMspanSpecial
|
||||||
|
lockRankSpanSetSpine
|
||||||
|
// MPROF
|
||||||
lockRankProfInsert
|
lockRankProfInsert
|
||||||
lockRankProfBlock
|
lockRankProfBlock
|
||||||
lockRankProfMemActive
|
lockRankProfMemActive
|
||||||
lockRankGcBitsArenas
|
|
||||||
lockRankSpanSetSpine
|
|
||||||
lockRankMheapSpecial
|
|
||||||
lockRankFin
|
|
||||||
lockRankProfMemFuture
|
lockRankProfMemFuture
|
||||||
|
// TRACE
|
||||||
lockRankTrace
|
lockRankTrace
|
||||||
lockRankTraceStackTab
|
lockRankTraceStackTab
|
||||||
lockRankNetpollInit
|
// STACKGROW
|
||||||
lockRankRwmutexR
|
|
||||||
lockRankGscan
|
lockRankGscan
|
||||||
lockRankStackpool
|
lockRankStackpool
|
||||||
lockRankStackLarge
|
lockRankStackLarge
|
||||||
lockRankHchanLeaf
|
lockRankHchanLeaf
|
||||||
lockRankSudog
|
// WB
|
||||||
lockRankWbufSpans
|
lockRankWbufSpans
|
||||||
lockRankMheap
|
lockRankMheap
|
||||||
lockRankGlobalAlloc
|
lockRankGlobalAlloc
|
||||||
|
lockRankDeadlock
|
||||||
lockRankPanic
|
lockRankPanic
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -64,48 +70,48 @@ const lockRankLeafRank lockRank = 1000
|
||||||
// lockNames gives the names associated with each of the above ranks.
|
// lockNames gives the names associated with each of the above ranks.
|
||||||
var lockNames = []string{
|
var lockNames = []string{
|
||||||
lockRankSysmon: "sysmon",
|
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",
|
lockRankScavenge: "scavenge",
|
||||||
lockRankForcegc: "forcegc",
|
lockRankForcegc: "forcegc",
|
||||||
|
lockRankDefer: "defer",
|
||||||
|
lockRankSweepWaiters: "sweepWaiters",
|
||||||
|
lockRankAssistQueue: "assistQueue",
|
||||||
|
lockRankSweep: "sweep",
|
||||||
|
lockRankPollDesc: "pollDesc",
|
||||||
|
lockRankCpuprof: "cpuprof",
|
||||||
lockRankSched: "sched",
|
lockRankSched: "sched",
|
||||||
lockRankAllg: "allg",
|
lockRankAllg: "allg",
|
||||||
lockRankAllp: "allp",
|
lockRankAllp: "allp",
|
||||||
lockRankTimers: "timers",
|
lockRankTimers: "timers",
|
||||||
lockRankReflectOffs: "reflectOffs",
|
lockRankNetpollInit: "netpollInit",
|
||||||
lockRankHchan: "hchan",
|
lockRankHchan: "hchan",
|
||||||
|
lockRankNotifyList: "notifyList",
|
||||||
|
lockRankSudog: "sudog",
|
||||||
|
lockRankRwmutexW: "rwmutexW",
|
||||||
|
lockRankRwmutexR: "rwmutexR",
|
||||||
|
lockRankRoot: "root",
|
||||||
|
lockRankItab: "itab",
|
||||||
|
lockRankReflectOffs: "reflectOffs",
|
||||||
lockRankTraceBuf: "traceBuf",
|
lockRankTraceBuf: "traceBuf",
|
||||||
lockRankTraceStrings: "traceStrings",
|
lockRankTraceStrings: "traceStrings",
|
||||||
|
lockRankFin: "fin",
|
||||||
|
lockRankGcBitsArenas: "gcBitsArenas",
|
||||||
|
lockRankMheapSpecial: "mheapSpecial",
|
||||||
lockRankMspanSpecial: "mspanSpecial",
|
lockRankMspanSpecial: "mspanSpecial",
|
||||||
|
lockRankSpanSetSpine: "spanSetSpine",
|
||||||
lockRankProfInsert: "profInsert",
|
lockRankProfInsert: "profInsert",
|
||||||
lockRankProfBlock: "profBlock",
|
lockRankProfBlock: "profBlock",
|
||||||
lockRankProfMemActive: "profMemActive",
|
lockRankProfMemActive: "profMemActive",
|
||||||
lockRankGcBitsArenas: "gcBitsArenas",
|
|
||||||
lockRankSpanSetSpine: "spanSetSpine",
|
|
||||||
lockRankMheapSpecial: "mheapSpecial",
|
|
||||||
lockRankFin: "fin",
|
|
||||||
lockRankProfMemFuture: "profMemFuture",
|
lockRankProfMemFuture: "profMemFuture",
|
||||||
lockRankTrace: "trace",
|
lockRankTrace: "trace",
|
||||||
lockRankTraceStackTab: "traceStackTab",
|
lockRankTraceStackTab: "traceStackTab",
|
||||||
lockRankNetpollInit: "netpollInit",
|
|
||||||
lockRankRwmutexR: "rwmutexR",
|
|
||||||
lockRankGscan: "gscan",
|
lockRankGscan: "gscan",
|
||||||
lockRankStackpool: "stackpool",
|
lockRankStackpool: "stackpool",
|
||||||
lockRankStackLarge: "stackLarge",
|
lockRankStackLarge: "stackLarge",
|
||||||
lockRankHchanLeaf: "hchanLeaf",
|
lockRankHchanLeaf: "hchanLeaf",
|
||||||
lockRankSudog: "sudog",
|
|
||||||
lockRankWbufSpans: "wbufSpans",
|
lockRankWbufSpans: "wbufSpans",
|
||||||
lockRankMheap: "mheap",
|
lockRankMheap: "mheap",
|
||||||
lockRankGlobalAlloc: "globalAlloc",
|
lockRankGlobalAlloc: "globalAlloc",
|
||||||
|
lockRankDeadlock: "deadlock",
|
||||||
lockRankPanic: "panic",
|
lockRankPanic: "panic",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -129,47 +135,47 @@ func (rank lockRank) String() string {
|
||||||
// Lock ranks that allow self-cycles list themselves.
|
// Lock ranks that allow self-cycles list themselves.
|
||||||
var lockPartialOrder [][]lockRank = [][]lockRank{
|
var lockPartialOrder [][]lockRank = [][]lockRank{
|
||||||
lockRankSysmon: {},
|
lockRankSysmon: {},
|
||||||
lockRankSweepWaiters: {},
|
|
||||||
lockRankAssistQueue: {},
|
|
||||||
lockRankCpuprof: {},
|
|
||||||
lockRankSweep: {},
|
|
||||||
lockRankPollDesc: {},
|
|
||||||
lockRankDeadlock: {},
|
|
||||||
lockRankItab: {},
|
|
||||||
lockRankNotifyList: {},
|
|
||||||
lockRankRoot: {},
|
|
||||||
lockRankRwmutexW: {},
|
|
||||||
lockRankDefer: {},
|
|
||||||
lockRankScavenge: {lockRankSysmon},
|
lockRankScavenge: {lockRankSysmon},
|
||||||
lockRankForcegc: {lockRankSysmon},
|
lockRankForcegc: {lockRankSysmon},
|
||||||
lockRankSched: {lockRankSysmon, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankPollDesc, lockRankScavenge, lockRankForcegc},
|
lockRankDefer: {},
|
||||||
lockRankAllg: {lockRankSysmon, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankPollDesc, lockRankScavenge, lockRankForcegc, lockRankSched},
|
lockRankSweepWaiters: {},
|
||||||
lockRankAllp: {lockRankSysmon, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankPollDesc, lockRankScavenge, lockRankForcegc, lockRankSched},
|
lockRankAssistQueue: {},
|
||||||
lockRankTimers: {lockRankSysmon, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankPollDesc, lockRankScavenge, lockRankForcegc, lockRankSched, lockRankAllp, lockRankTimers},
|
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},
|
lockRankReflectOffs: {lockRankItab},
|
||||||
lockRankHchan: {lockRankSysmon, lockRankSweep, lockRankScavenge, lockRankHchan},
|
|
||||||
lockRankTraceBuf: {lockRankSysmon, lockRankScavenge},
|
lockRankTraceBuf: {lockRankSysmon, lockRankScavenge},
|
||||||
lockRankTraceStrings: {lockRankSysmon, lockRankScavenge, lockRankTraceBuf},
|
lockRankTraceStrings: {lockRankSysmon, lockRankScavenge, lockRankTraceBuf},
|
||||||
lockRankMspanSpecial: {lockRankSysmon, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankPollDesc, lockRankItab, lockRankNotifyList, lockRankScavenge, lockRankForcegc, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankReflectOffs, lockRankHchan, lockRankTraceBuf, lockRankTraceStrings},
|
lockRankFin: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankHchan, lockRankNotifyList, lockRankItab, lockRankReflectOffs, lockRankTraceBuf, lockRankTraceStrings},
|
||||||
lockRankProfInsert: {lockRankSysmon, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankPollDesc, lockRankItab, lockRankNotifyList, lockRankScavenge, lockRankForcegc, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankReflectOffs, lockRankHchan, lockRankTraceBuf, lockRankTraceStrings},
|
lockRankGcBitsArenas: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankHchan, lockRankNotifyList, lockRankItab, lockRankReflectOffs, lockRankTraceBuf, lockRankTraceStrings},
|
||||||
lockRankProfBlock: {lockRankSysmon, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankPollDesc, lockRankItab, lockRankNotifyList, lockRankScavenge, lockRankForcegc, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankReflectOffs, lockRankHchan, lockRankTraceBuf, lockRankTraceStrings},
|
lockRankMheapSpecial: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankHchan, lockRankNotifyList, lockRankItab, lockRankReflectOffs, lockRankTraceBuf, lockRankTraceStrings},
|
||||||
lockRankProfMemActive: {lockRankSysmon, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankPollDesc, lockRankItab, lockRankNotifyList, lockRankScavenge, lockRankForcegc, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankReflectOffs, lockRankHchan, lockRankTraceBuf, lockRankTraceStrings},
|
lockRankMspanSpecial: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankHchan, lockRankNotifyList, lockRankItab, lockRankReflectOffs, lockRankTraceBuf, lockRankTraceStrings},
|
||||||
lockRankGcBitsArenas: {lockRankSysmon, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankPollDesc, lockRankItab, lockRankNotifyList, lockRankScavenge, lockRankForcegc, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankReflectOffs, lockRankHchan, lockRankTraceBuf, lockRankTraceStrings},
|
lockRankSpanSetSpine: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankHchan, lockRankNotifyList, lockRankItab, lockRankReflectOffs, lockRankTraceBuf, lockRankTraceStrings},
|
||||||
lockRankSpanSetSpine: {lockRankSysmon, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankPollDesc, lockRankItab, lockRankNotifyList, lockRankScavenge, lockRankForcegc, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankReflectOffs, lockRankHchan, lockRankTraceBuf, lockRankTraceStrings},
|
lockRankProfInsert: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankHchan, lockRankNotifyList, lockRankItab, lockRankReflectOffs, lockRankTraceBuf, lockRankTraceStrings},
|
||||||
lockRankMheapSpecial: {lockRankSysmon, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankPollDesc, lockRankItab, lockRankNotifyList, lockRankScavenge, lockRankForcegc, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankReflectOffs, lockRankHchan, lockRankTraceBuf, lockRankTraceStrings},
|
lockRankProfBlock: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankHchan, lockRankNotifyList, lockRankItab, lockRankReflectOffs, lockRankTraceBuf, lockRankTraceStrings},
|
||||||
lockRankFin: {lockRankSysmon, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankPollDesc, lockRankItab, lockRankNotifyList, lockRankScavenge, lockRankForcegc, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankReflectOffs, lockRankHchan, lockRankTraceBuf, lockRankTraceStrings},
|
lockRankProfMemActive: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankHchan, lockRankNotifyList, lockRankItab, lockRankReflectOffs, lockRankTraceBuf, lockRankTraceStrings},
|
||||||
lockRankProfMemFuture: {lockRankSysmon, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankPollDesc, lockRankItab, lockRankNotifyList, lockRankScavenge, lockRankForcegc, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankReflectOffs, lockRankHchan, lockRankTraceBuf, lockRankTraceStrings, lockRankProfMemActive},
|
lockRankProfMemFuture: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankHchan, lockRankNotifyList, lockRankItab, lockRankReflectOffs, lockRankTraceBuf, lockRankTraceStrings, lockRankProfMemActive},
|
||||||
lockRankTrace: {lockRankSysmon, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankPollDesc, lockRankItab, lockRankNotifyList, lockRankRoot, lockRankScavenge, lockRankForcegc, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankReflectOffs, lockRankHchan, lockRankTraceBuf, lockRankTraceStrings, lockRankFin},
|
lockRankTrace: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankHchan, lockRankNotifyList, lockRankRoot, lockRankItab, lockRankReflectOffs, 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},
|
lockRankTraceStackTab: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankPollDesc, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankHchan, lockRankNotifyList, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankTrace},
|
||||||
lockRankNetpollInit: {lockRankSysmon, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankPollDesc, lockRankScavenge, lockRankForcegc, lockRankSched, lockRankAllp, lockRankTimers},
|
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},
|
||||||
lockRankRwmutexR: {lockRankSysmon, lockRankRwmutexW},
|
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},
|
||||||
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},
|
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},
|
||||||
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},
|
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},
|
||||||
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},
|
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},
|
||||||
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},
|
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},
|
||||||
lockRankSudog: {lockRankSysmon, lockRankSweep, lockRankNotifyList, lockRankScavenge, lockRankHchan},
|
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},
|
||||||
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},
|
lockRankDeadlock: {},
|
||||||
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},
|
|
||||||
lockRankPanic: {lockRankDeadlock},
|
lockRankPanic: {lockRankDeadlock},
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,42 +32,144 @@ import (
|
||||||
// lock, which means no other lock can be acquired while it is held.
|
// 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.
|
// 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
|
// TODO: It's often hard to correlate rank names to locks. Change
|
||||||
// these to be more consistent with the locks they label.
|
// these to be more consistent with the locks they label.
|
||||||
const ranks = `
|
const ranks = `
|
||||||
NONE < sysmon, sweepWaiters, assistQueue, cpuprof, sweep, pollDesc, deadlock, itab, notifyList, root, rwmutexW, defer;
|
# Sysmon
|
||||||
sysmon < scavenge, forcegc;
|
NONE
|
||||||
assistQueue, cpuprof, forcegc, pollDesc, scavenge, sweep, sweepWaiters < sched;
|
< 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;
|
sched < allg, allp;
|
||||||
allp < timers;
|
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;
|
timers < netpollInit;
|
||||||
|
|
||||||
|
# Channels
|
||||||
|
scavenge, sweep < hchan;
|
||||||
|
NONE < notifyList;
|
||||||
|
hchan, notifyList < sudog;
|
||||||
|
|
||||||
|
# RWMutex
|
||||||
|
NONE < rwmutexW;
|
||||||
rwmutexW, sysmon < rwmutexR;
|
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, rwmutexR < stackpool;
|
||||||
gscan < stackLarge;
|
gscan < stackLarge;
|
||||||
|
# Generally, hchan must be acquired before gscan. But in one case,
|
||||||
# Generally, hchan must be acquired before gscan. But in one specific
|
# where we suspend a G and then shrink its stack, syncadjustsudogs
|
||||||
# case (in syncadjustsudogs from markroot after the g has been suspended
|
# can acquire hchan locks while holding gscan. To allow this case,
|
||||||
# by suspendG), we allow gscan to be acquired, and then an hchan lock. To
|
# we use hchanLeaf instead of hchan.
|
||||||
# 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.
|
|
||||||
gscan < hchanLeaf;
|
gscan < hchanLeaf;
|
||||||
|
|
||||||
hchan, notifyList < sudog;
|
# Write barrier
|
||||||
defer, gscan, mspanSpecial, sudog < wbufSpans;
|
defer,
|
||||||
stackLarge, stackpool, wbufSpans < mheap;
|
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;
|
mheap, mheapSpecial < globalAlloc;
|
||||||
|
|
||||||
# panic is handled specially. It is implicitly below all other locks.
|
# panic is handled specially. It is implicitly below all other locks.
|
||||||
|
NONE < deadlock;
|
||||||
deadlock < panic;
|
deadlock < panic;
|
||||||
`
|
`
|
||||||
|
|
||||||
|
@ -158,7 +260,11 @@ const (
|
||||||
|
|
||||||
`)
|
`)
|
||||||
for _, rank := range topo {
|
for _, rank := range topo {
|
||||||
fmt.Fprintf(w, "\t%s\n", cname(rank))
|
if isPseudo(rank) {
|
||||||
|
fmt.Fprintf(w, "\t// %s\n", rank)
|
||||||
|
} else {
|
||||||
|
fmt.Fprintf(w, "\t%s\n", cname(rank))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
fmt.Fprintf(w, `)
|
fmt.Fprintf(w, `)
|
||||||
|
|
||||||
|
@ -173,7 +279,9 @@ const lockRankLeafRank lockRank = 1000
|
||||||
var lockNames = []string{
|
var lockNames = []string{
|
||||||
`)
|
`)
|
||||||
for _, rank := range topo {
|
for _, rank := range topo {
|
||||||
fmt.Fprintf(w, "\t%s: %q,\n", cname(rank), rank)
|
if !isPseudo(rank) {
|
||||||
|
fmt.Fprintf(w, "\t%s: %q,\n", cname(rank), rank)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
fmt.Fprintf(w, `}
|
fmt.Fprintf(w, `}
|
||||||
|
|
||||||
|
@ -201,9 +309,14 @@ func (rank lockRank) String() string {
|
||||||
var lockPartialOrder [][]lockRank = [][]lockRank{
|
var lockPartialOrder [][]lockRank = [][]lockRank{
|
||||||
`)
|
`)
|
||||||
for _, rank := range topo {
|
for _, rank := range topo {
|
||||||
|
if isPseudo(rank) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
list := []string{}
|
list := []string{}
|
||||||
for _, before := range g.Edges(rank) {
|
for _, before := range g.Edges(rank) {
|
||||||
list = append(list, cname(before))
|
if !isPseudo(before) {
|
||||||
|
list = append(list, cname(before))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if cyclicRanks[rank] {
|
if cyclicRanks[rank] {
|
||||||
list = append(list, cname(rank))
|
list = append(list, cname(rank))
|
||||||
|
@ -219,6 +332,10 @@ func cname(label string) string {
|
||||||
return "lockRank" + strings.ToUpper(label[:1]) + label[1:]
|
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.
|
// generateDot emits a Graphviz dot representation of g to w.
|
||||||
func generateDot(w io.Writer, g *dag.Graph) {
|
func generateDot(w io.Writer, g *dag.Graph) {
|
||||||
fmt.Fprintf(w, "digraph g {\n")
|
fmt.Fprintf(w, "digraph g {\n")
|
||||||
|
|
Loading…
Reference in a new issue