• Austin Clements's avatar
    runtime: fix sigprof stack barrier locking · 3f22adec
    Austin Clements authored
    f90b48e0 intended to require the stack barrier lock in all cases of
    sigprof that walked the user stack, but got it wrong. In particular,
    if sp < gp.stack.lo || gp.stack.hi < sp, tracebackUser would be true,
    but we wouldn't acquire the stack lock. If it then turned out that we
    were in a cgo call, it would walk the stack without the lock.
    
    In fact, the whole structure of stack locking is sigprof is somewhat
    wrong because it assumes the G to lock is gp.m.curg, but all three
    gentraceback calls start from potentially different Gs.
    
    To fix this, we lower the gcTryLockStackBarriers calls much closer to
    the gentraceback calls. There are now three separate trylock calls,
    each clearly associated with a gentraceback and the locked G clearly
    matches the G from which the gentraceback starts. This actually brings
    the sigprof logic closer to what it originally was before stack
    barrier locking.
    
    This depends on "runtime: increase assumed stack size in
    externalthreadhandler" because it very slightly increases the stack
    used by sigprof; without this other commit, this is enough to blow the
    profiler thread's assumed stack size.
    
    Fixes #12528 (hopefully for real this time!).
    
    For the 1.5 branch, though it will require some backporting. On the
    1.5 branch, this will *not* require the "runtime: increase assumed
    stack size in externalthreadhandler" commit: there's no pcvalue cache,
    so the used stack is smaller.
    
    Change-Id: Id2f6446ac276848f6fc158bee550cccd03186b83
    Reviewed-on: https://go-review.googlesource.com/18328
    Run-TryBot: Austin Clements <austin@google.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
    3f22adec
proc.go 115 KB