• Austin Clements's avatar
    runtime: generally allow preemption during concurrent GC phases · af060c30
    Austin Clements authored
    Currently, the entire GC process runs with g.m.preemptoff set. In the
    concurrent phases, the parts that actually need preemption disabled
    are run on a system stack and there's no overall need to stay on the
    same M or P during the concurrent phases. Hence, move the setting of
    g.m.preemptoff to when we start mark termination, at which point we
    really do need preemption disabled.
    
    This dramatically changes the scheduling behavior of the concurrent
    mark phase. Currently, since this is non-preemptible, concurrent mark
    gets one dedicated P (so 1/GOMAXPROCS utilization). With this change,
    the GC goroutine is scheduled like any other goroutine during
    concurrent mark, so it gets 1/<runnable goroutines> utilization.
    
    You might think it's not even necessary to set g.m.preemptoff at that
    point since the world is stopped, but stackalloc/stackfree use this as
    a signal that the per-P pools are not safe to access without
    synchronization.
    
    Change-Id: I08aebe8179a7d304650fb8449ff36262b3771099
    Reviewed-on: https://go-review.googlesource.com/8839Reviewed-by: 's avatarRick Hudson <rlh@golang.org>
    af060c30
Name
Last commit
Last update
..
archive Loading commit data...
bufio Loading commit data...
builtin Loading commit data...
bytes Loading commit data...
cmd Loading commit data...
compress Loading commit data...
container Loading commit data...
crypto Loading commit data...
database/sql Loading commit data...
debug Loading commit data...
encoding Loading commit data...
errors Loading commit data...
expvar Loading commit data...
flag Loading commit data...
fmt Loading commit data...
go Loading commit data...
hash Loading commit data...
html Loading commit data...
image Loading commit data...
index/suffixarray Loading commit data...
internal Loading commit data...
io Loading commit data...
log Loading commit data...
math Loading commit data...
mime Loading commit data...
net Loading commit data...
os Loading commit data...
path Loading commit data...
reflect Loading commit data...
regexp Loading commit data...
runtime Loading commit data...
sort Loading commit data...
strconv Loading commit data...
strings Loading commit data...
sync Loading commit data...
syscall Loading commit data...
testing Loading commit data...
text Loading commit data...
time Loading commit data...
unicode Loading commit data...
unsafe Loading commit data...
Make.dist Loading commit data...
all.bash Loading commit data...
all.bat Loading commit data...
all.rc Loading commit data...
androidtest.bash Loading commit data...
bootstrap.bash Loading commit data...
clean.bash Loading commit data...
clean.bat Loading commit data...
clean.rc Loading commit data...
iostest.bash Loading commit data...
make.bash Loading commit data...
make.bat Loading commit data...
make.rc Loading commit data...
nacltest.bash Loading commit data...
race.bash Loading commit data...
race.bat Loading commit data...
run.bash Loading commit data...
run.bat Loading commit data...
run.rc Loading commit data...