• philhofer's avatar
    runtime: fix pprof livelock on arm · afae876b
    philhofer authored
    On 32-bit architectures without native 64-bit atomic instructions,
    64-bit atomics are emulated using spinlocks. However,
    the sigprof handling code expects to be able to perform
    64-bit atomic operations in signal handlers. Spinning on an
    acquired spinlock in a signal handler leads to a livelock.
    This is issue #20146.
    
    The original fix for #20146 did not include arm in
    the list of architectures that need to work around portability
    issues in the sigprof handler code. The unit test designed to
    catch this issue does not fail on arm builds because arm uses
    striped spinlocks, and thus the livelock takes many minutes
    to reproduce. This is issue #24260. (This patch doesn't completely
    fix #24260 on go1.10.2 due to issue #25785, which is probably
    related to the arm cas kernel helpers. Those have been removed
    at tip.)
    
    With this patch applied, I was able to run the reproducer for
    issue #24260 for more than 90 minutes without reproducing the
    livelock. Without this patch, the livelock took as little as
    8 minutes to reproduce.
    
    Fixes #20146
    Updates #24260
    
    Change-Id: I64bf53a14d53c4932367d919ac55e17c99d87484
    Reviewed-on: https://go-review.googlesource.com/117057
    Run-TryBot: Philip Hofer <phofer@umich.edu>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
    Reviewed-by: 's avatarCherry Zhang <cherryyz@google.com>
    afae876b
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...