• Austin Clements's avatar
    runtime: make fixalloc zero allocations on reuse · ae3bb4a5
    Austin Clements authored
    Currently fixalloc does not zero memory it reuses. This is dangerous
    with the hybrid barrier if the type may contain heap pointers, since
    it may cause us to observe a dead heap pointer on reuse. It's also
    error-prone since it's the only allocator that doesn't zero on
    allocation (mallocgc of course zeroes, but so do persistentalloc and
    sysAlloc). It's also largely pointless: for mcache, the caller
    immediately memclrs the allocation; and the two specials types are
    tiny so there's no real cost to zeroing them.
    
    Change fixalloc to zero allocations by default.
    
    The only type we don't zero by default is mspan. This actually
    requires that the spsn's sweepgen survive across freeing and
    reallocating a span. If we were to zero it, the following race would
    be possible:
    
    1. The current sweepgen is 2. Span s is on the unswept list.
    
    2. Direct sweeping sweeps span s, finds it's all free, and releases s
       to the fixalloc.
    
    3. Thread 1 allocates s from fixalloc. Suppose this zeros s, including
       s.sweepgen.
    
    4. Thread 1 calls s.init, which sets s.state to _MSpanDead.
    
    5. On thread 2, background sweeping comes across span s in allspans
       and cas's s.sweepgen from 0 (sg-2) to 1 (sg-1). Now it thinks it
       owns it for sweeping. 6. Thread 1 continues initializing s.
       Everything breaks.
    
    I would like to fix this because it's obviously confusing, but it's a
    subtle enough problem that I'm leaving it alone for now. The solution
    may be to skip sweepgen 0, but then we have to think about wrap-around
    much more carefully.
    
    Updates #17503.
    
    Change-Id: Ie08691feed3abbb06a31381b94beb0a2e36a0613
    Reviewed-on: https://go-review.googlesource.com/31368Reviewed-by: 's avatarKeith Randall <khr@golang.org>
    Reviewed-by: 's avatarRick Hudson <rlh@golang.org>
    ae3bb4a5
mcache.go 4.11 KB