• Austin Clements's avatar
    runtime: yield to GC coordinator after assist completion · 500c88d4
    Austin Clements authored
    Currently it's possible for the GC assist to signal completion of the
    mark phase, which puts the GC coordinator goroutine on the current P's
    run queue, and then return to mutator code that delays until the next
    forced preemption before actually yielding control to the GC
    coordinator, dragging out completion of the mark phase. This delay can
    be further exacerbated if the mutator makes other goroutines runnable
    before yielding control, since this will push the GC coordinator on
    the back of the P's run queue.
    
    To fix this, this adds a Gosched to the assist if it completed the
    mark phase. This immediately and directly yields control to the GC
    coordinator. This already happens implicitly in the background mark
    workers because they park immediately after completing the mark.
    
    This is one of the reasons completion of the mark phase is being
    dragged out and allowing the mutator to allocate without assisting,
    leading to the large heap goal overshoot in issue #11677. This is also
    a prerequisite to making the assist block when it can't pay off its
    debt.
    
    Change-Id: I586adfbecb3ca042a37966752c1dc757f5c7fc78
    Reviewed-on: https://go-review.googlesource.com/12670Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
    500c88d4
mgcmark.go 29.7 KB