• Austin Clements's avatar
    runtime: scan mark worker stacks like normal · d6625caf
    Austin Clements authored
    Currently, markroot delays scanning mark worker stacks until mark
    termination by putting the mark worker G directly on the rescan list
    when it encounters one during the mark phase. Without this, since mark
    workers are non-preemptible, two mark workers that attempt to scan
    each other's stacks can deadlock.
    
    However, this is annoyingly asymmetric and causes some real problems.
    First, markroot does not own the G at that point, so it's not
    technically safe to add it to the rescan list. I haven't been able to
    find a specific problem this could cause, but I suspect it's the root
    cause of issue #17099. Second, this will interfere with the hybrid
    barrier, since there is no stack rescanning during mark termination
    with the hybrid barrier.
    
    This commit switches to a different approach. We move the mark
    worker's call to gcDrain to the system stack and set the mark worker's
    status to _Gwaiting for the duration of the drain to indicate that
    it's preemptible. This lets another mark worker scan its G stack while
    the drain is running on the system stack. We don't return to the G
    stack until we can switch back to _Grunning, which ensures we don't
    race with a stack scan. This lets us eliminate the special case for
    mark worker stack scans and scan them just like any other goroutine.
    The only subtlety to this approach is that we have to disable stack
    shrinking for mark workers; they could be referring to captured
    variables from the G stack, so it's not safe to move their stacks.
    
    Updates #17099 and #17503.
    
    Change-Id: Ia5213949ec470af63e24dfce01df357c12adbbea
    Reviewed-on: https://go-review.googlesource.com/31820
    Run-TryBot: Austin Clements <austin@google.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: 's avatarRick Hudson <rlh@golang.org>
    d6625caf
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...
context 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...
plugin 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...
vendor/golang_org/x 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...
buildall.bash Loading commit data...
clean.bash Loading commit data...
clean.bat Loading commit data...
clean.rc Loading commit data...
cmp.bash Loading commit data...
iostest.bash Loading commit data...
make.bash Loading commit data...
make.bat Loading commit data...
make.rc Loading commit data...
naclmake.bash 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...