]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: allow proflock and mheap.speciallock above globalAlloc.mutex
authorMichael Pratt <mpratt@google.com>
Fri, 17 Apr 2020 19:36:13 +0000 (15:36 -0400)
committerMichael Pratt <mpratt@google.com>
Tue, 21 Apr 2020 20:22:06 +0000 (20:22 +0000)
During schedinit, these may occur in:

mProf_Malloc
  stkbucket
    newBucket
      persistentalloc
        persistentalloc1

mProf_Malloc
  setprofilebucket
    fixalloc.alloc
      persistentalloc
        persistentalloc1

These seem to be legitimate lock orderings.

Additionally, mheap.speciallock had a defined rank, but it was never
actually used. That is fixed now.

Updates #38474

Change-Id: I0f6e981852eac66dafb72159f426476509620a65
Reviewed-on: https://go-review.googlesource.com/c/go/+/228786
Run-TryBot: Michael Pratt <mpratt@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Dan Scales <danscales@google.com>
src/runtime/lockrank.go
src/runtime/mheap.go

index 784f4236f4fca99f5c49695bdec8e2ceaa8ebd32..d96369b1a58da58704ba270f4b16330f3832fc46 100644 (file)
@@ -76,9 +76,9 @@ const (
        // Memory-related non-leaf locks
        lockRankWbufSpans
        lockRankMheap
+       lockRankMheapSpecial
 
        // Memory-related leaf locks
-       lockRankMheapSpecial
        lockRankGlobalAlloc
 
        // Other leaf locks
@@ -144,11 +144,11 @@ var lockNames = []string{
        lockRankDefer:      "defer",
        lockRankSudog:      "sudog",
 
-       lockRankWbufSpans: "wbufSpans",
-       lockRankMheap:     "mheap",
-
+       lockRankWbufSpans:    "wbufSpans",
+       lockRankMheap:        "mheap",
        lockRankMheapSpecial: "mheapSpecial",
-       lockRankGlobalAlloc:  "globalAlloc.mutex",
+
+       lockRankGlobalAlloc: "globalAlloc.mutex",
 
        lockRankGFree: "gFree",
 
@@ -221,7 +221,7 @@ var lockPartialOrder [][]lockRank = [][]lockRank{
        lockRankWbufSpans:    {lockRankScavenge, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankSched, lockRankAllg, lockRankPollDesc, lockRankTimers, lockRankItab, lockRankReflectOffs, lockRankHchan, lockRankNotifyList, lockRankTraceStrings, lockRankMspanSpecial, lockRankProf, lockRankRoot, lockRankDefer, lockRankSudog},
        lockRankMheap:        {lockRankScavenge, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankSched, lockRankAllg, lockRankAllp, lockRankPollDesc, lockRankTimers, lockRankItab, lockRankReflectOffs, lockRankNotifyList, lockRankTraceBuf, lockRankTraceStrings, lockRankHchan, lockRankMspanSpecial, lockRankProf, lockRankGcBitsArenas, lockRankRoot, lockRankMcentral, lockRankStackpool, lockRankStackLarge, lockRankDefer, lockRankSudog, lockRankWbufSpans},
        lockRankMheapSpecial: {lockRankScavenge, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankItab, lockRankReflectOffs, lockRankNotifyList, lockRankTraceBuf, lockRankTraceStrings, lockRankHchan},
-       lockRankGlobalAlloc:  {lockRankSpine, lockRankMheap},
+       lockRankGlobalAlloc:  {lockRankProf, lockRankSpine, lockRankMheap, lockRankMheapSpecial},
 
        lockRankGFree: {lockRankSched},
 
index 9774dfb282ae6b6873f967bf3a64ea5ba978953d..9bb33b2000b0c58f2a9f85f32bc36b6e4d35784f 100644 (file)
@@ -673,6 +673,7 @@ func (h *mheap) init() {
        lockInit(&h.lock, lockRankMheap)
        lockInit(&h.sweepSpans[0].spineLock, lockRankSpine)
        lockInit(&h.sweepSpans[1].spineLock, lockRankSpine)
+       lockInit(&h.speciallock, lockRankMheapSpecial)
 
        h.spanalloc.init(unsafe.Sizeof(mspan{}), recordspan, unsafe.Pointer(h), &memstats.mspan_sys)
        h.cachealloc.init(unsafe.Sizeof(mcache{}), nil, nil, &memstats.mcache_sys)