• Dmitry Vyukov's avatar
    runtime: bound defer pools (try 2) · b759e225
    Dmitry Vyukov authored
    The unbounded list-based defer pool can grow infinitely.
    This can happen if a goroutine routinely allocates a defer;
    then blocks on one P; and then unblocked, scheduled and
    frees the defer on another P.
    The scenario was reported on golang-nuts list.
    
    We've been here several times. Any unbounded local caches
    are bad and grow to infinite size. This change introduces
    central defer pool; local pools become fixed-size
    with the only purpose of amortizing accesses to the
    central pool.
    
    Freedefer now executes on system stack to not consume
    nosplit stack space.
    
    Change-Id: I1a27695838409259d1586a0adfa9f92bccf7ceba
    Reviewed-on: https://go-review.googlesource.com/3967Reviewed-by: 's avatarKeith Randall <khr@golang.org>
    Run-TryBot: Dmitry Vyukov <dvyukov@google.com>
    b759e225
proc1.go 87.5 KB