• Michael Anthony Knyszek's avatar
    runtime: don't hold worldsema across mark phase · 7b294cdd
    Michael Anthony Knyszek authored
    This change makes it so that worldsema isn't held across the mark phase.
    This means that various operations like ReadMemStats may now stop the
    world during the mark phase, reducing latency on such operations.
    
    Only three such operations are still no longer allowed to occur during
    marking: GOMAXPROCS, StartTrace, and StopTrace.
    
    For the former it's because any change to GOMAXPROCS impacts GC mark
    background worker scheduling and the details there are tricky.
    
    For the latter two it's because tracing needs to observe consistent GC
    start and GC end events, and if StartTrace or StopTrace may stop the
    world during marking, then it's possible for it to see a GC end event
    without a start or GC start event without an end, respectively.
    
    To ensure that GOMAXPROCS and StartTrace/StopTrace cannot proceed until
    marking is complete, the runtime now holds a new semaphore, gcsema,
    across the mark phase just like it used to with worldsema.
    
    Fixes #19812.
    
    Change-Id: I15d43ed184f711b3d104e8f267fb86e335f86bf9
    Reviewed-on: https://go-review.googlesource.com/c/go/+/182657
    Run-TryBot: Michael Knyszek <mknyszek@google.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: default avatarKeith Randall <khr@golang.org>
    Reviewed-by: default avatarCherry Zhang <cherryyz@google.com>
    7b294cdd
proc.go 146 KB