runtime: two proc bug fixes
1. Fix bug in GOMAXPROCS when trying to cut number of procs
Race could happen on any system but was
manifesting only on Xen hosted Linux.
2. Fix recover on ARM, where FP != caller SP.
R=r
CC=golang-dev
https://golang.org/cl/880043
diff --git a/src/pkg/runtime/proc.c b/src/pkg/runtime/proc.c
index 8473cd2..454a4a2 100644
--- a/src/pkg/runtime/proc.c
+++ b/src/pkg/runtime/proc.c
@@ -352,6 +352,10 @@
gcwaiting = 1;
sched.mcpumax = 1;
while(sched.mcpu > 1) {
+ // It would be unsafe for multiple threads to be using
+ // the stopped note at once, but there is only
+ // ever one thread doing garbage collection,
+ // so this is okay.
noteclear(&sched.stopped);
sched.waitstop = 1;
unlock(&sched);
@@ -989,6 +993,8 @@
Stktop *top, *oldtop;
Panic *p;
+ fp = getcallersp(fp);
+
// Must be a panic going on.
if((p = g->panic) == nil || p->recovered)
goto nomatch;
@@ -1113,13 +1119,14 @@
lock(&sched);
sched.gomaxprocs = n;
sched.mcpumax = n;
- // handle fewer procs
- while(sched.mcpu > sched.mcpumax) {
- noteclear(&sched.stopped);
- sched.waitstop = 1;
+ // handle fewer procs?
+ if(sched.mcpu > sched.mcpumax) {
unlock(&sched);
- notesleep(&sched.stopped);
- lock(&sched);
+ // just give up the cpu.
+ // we'll only get rescheduled once the
+ // number has come down.
+ gosched();
+ return;
}
// handle more procs
matchmg();