This patch from Peter Collingbourne marks runtime_goexit as noinline. If we don't do that, it may be inlined into the kickoff function. That function refers to the TLS variable g, as does runtime_goexit. But by the time kickoff calls runtime_goexit, it may be running in a different thread. If the address of g is cached, and runtime_goexit is inlined into kickoff, then then the fetch of g in runtime_goexit may get the value from the wrong thread. Bootstrapped and ran Go testsuite on x86_64-unknown-linux-gnu. Committed to mainline.
Ian
diff -r 8aa5c486a3af libgo/runtime/proc.c --- a/libgo/runtime/proc.c Mon Sep 22 13:17:47 2014 -0700 +++ b/libgo/runtime/proc.c Mon Sep 22 14:00:38 2014 -0700 @@ -1894,6 +1894,7 @@ // Need to mark it as nosplit, because it runs with sp > stackbase (as runtime_lessstack). // Since it does not return it does not matter. But if it is preempted // at the split stack check, GC will complain about inconsistent sp. +void runtime_goexit(void) __attribute__ ((noinline)); void runtime_goexit(void) {