• Russ Cox's avatar
    runtime: always run stackalloc on scheduler stack · b5dfac45
    Russ Cox authored
    Avoids deadlocks like the one below, in which a stack split happened
    in order to call lock(&stacks), but then the stack unsplit cannot run
    because stacks is now locked.
    
    The only code calling stackalloc that wasn't on a scheduler
    stack already was malg, which creates a new goroutine.
    
    runtime.futex+0x23 /home/rsc/g/go/src/pkg/runtime/linux/amd64/sys.s:139
           runtime.futex()
    futexsleep+0x50 /home/rsc/g/go/src/pkg/runtime/linux/thread.c:51
           futexsleep(0x5b0188, 0x300000003, 0x100020000, 0x4159e2)
    futexlock+0x85 /home/rsc/g/go/src/pkg/runtime/linux/thread.c:119
           futexlock(0x5b0188, 0x5b0188)
    runtime.lock+0x56 /home/rsc/g/go/src/pkg/runtime/linux/thread.c:158
           runtime.lock(0x5b0188, 0x7f0d27b4a000)
    runtime.stackfree+0x4d /home/rsc/g/go/src/pkg/runtime/malloc.goc:336
           runtime.stackfree(0x7f0d27b4a000, 0x1000, 0x8, 0x7fff37e1e218)
    runtime.oldstack+0xa6 /home/rsc/g/go/src/pkg/runtime/proc.c:705
           runtime.oldstack()
    runtime.lessstack+0x22 /home/rsc/g/go/src/pkg/runtime/amd64/asm.s:224
           runtime.lessstack()
    ----- lessstack called from goroutine 2 -----
    runtime.lock+0x56 /home/rsc/g/go/src/pkg/runtime/linux/thread.c:158
           runtime.lock(0x5b0188, 0x40a5e2)
    runtime.stackalloc+0x55 /home/rsc/g/go/src/pkg/runtime/malloc.c:316
           runtime.stackalloc(0x1000, 0x4055b0)
    runtime.malg+0x3d /home/rsc/g/go/src/pkg/runtime/proc.c:803
           runtime.malg(0x1000, 0x40add9)
    runtime.newproc1+0x12b /home/rsc/g/go/src/pkg/runtime/proc.c:854
           runtime.newproc1(0xf840027440, 0x7f0d27b49230, 0x0, 0x49f238, 0x40, ...)
    runtime.newproc+0x2f /home/rsc/g/go/src/pkg/runtime/proc.c:831
           runtime.newproc(0x0, 0xf840027440, 0xf800000010, 0x44b059)
    ...
    
    R=r, r2
    CC=golang-dev
    https://golang.org/cl/4216045
    b5dfac45
malloc.goc 13.3 KB