• Rick Hudson's avatar
    runtime: force mutator to give work buffer to GC · e95bc5fe
    Rick Hudson authored
    The scheduler, work buffer's dispose, and write barriers
    can conspire to hide the a pointer from the GC's concurent
    mark phase. If this pointer is the only path to a large
    amount of marking the STW mark termination phase may take
    a lot of time.
    
    Consider the following:
    1) dispose places a work buffer on the partial queue
    2) the GC is busy so it does not immediately remove and
       process the work buffer
    3) the scheduler runs a mutator whose write barrier dequeues the
       work buffer from the partial queue so the GC won't see it
    This repeats until the GC reaches the mark termination
    phase where the GC finally discovers the pointer along
    with a lot of work to do.
    
    This CL fixes the problem by having the mutator
    dispose of the buffer to the full queue instead of
    the partial queue. Since the write buffer never asks for full
    buffers the conspiracy described above is not possible.
    
    Updates #11694.
    
    Change-Id: I2ce832f9657a7570f800e8ce4459cd9e304ef43b
    Reviewed-on: https://go-review.googlesource.com/12840Reviewed-by: default avatarAustin Clements <austin@google.com>
    e95bc5fe
mgc.go 55.8 KB