Commit 2572ca2f authored by Hector Chu's avatar Hector Chu

runtime: include bootstrap m in mcpu accounting

R=rsc, dvyukov
CC=golang-dev
https://golang.org/cl/5307052
parent d72267ae
...@@ -128,6 +128,8 @@ Sched runtime·sched; ...@@ -128,6 +128,8 @@ Sched runtime·sched;
int32 runtime·gomaxprocs; int32 runtime·gomaxprocs;
bool runtime·singleproc; bool runtime·singleproc;
static bool canaddmcpu(void);
// An m that is waiting for notewakeup(&m->havenextg). This may // An m that is waiting for notewakeup(&m->havenextg). This may
// only be accessed while the scheduler lock is held. This is used to // only be accessed while the scheduler lock is held. This is used to
// minimize the number of times we call notewakeup while the scheduler // minimize the number of times we call notewakeup while the scheduler
...@@ -202,6 +204,10 @@ runtime·schedinit(void) ...@@ -202,6 +204,10 @@ runtime·schedinit(void)
setmcpumax(runtime·gomaxprocs); setmcpumax(runtime·gomaxprocs);
runtime·singleproc = runtime·gomaxprocs == 1; runtime·singleproc = runtime·gomaxprocs == 1;
canaddmcpu(); // mcpu++ to account for bootstrap m
m->helpgc = 1; // flag to tell schedule() to mcpu--
runtime·sched.grunning++;
mstats.enablegc = 1; mstats.enablegc = 1;
m->nomemprof--; m->nomemprof--;
} }
...@@ -811,6 +817,7 @@ schedule(G *gp) ...@@ -811,6 +817,7 @@ schedule(G *gp)
readylocked(gp); readylocked(gp);
} }
} else if(m->helpgc) { } else if(m->helpgc) {
// Bootstrap m or new m started by starttheworld.
// atomic { mcpu-- } // atomic { mcpu-- }
v = runtime·xadd(&runtime·sched.atomic, -1<<mcpuShift); v = runtime·xadd(&runtime·sched.atomic, -1<<mcpuShift);
if(atomic_mcpu(v) > maxgomaxprocs) if(atomic_mcpu(v) > maxgomaxprocs)
...@@ -818,6 +825,10 @@ schedule(G *gp) ...@@ -818,6 +825,10 @@ schedule(G *gp)
// Compensate for increment in starttheworld(). // Compensate for increment in starttheworld().
runtime·sched.grunning--; runtime·sched.grunning--;
m->helpgc = 0; m->helpgc = 0;
} else if(m->nextg != nil) {
// New m started by matchmg.
} else {
runtime·throw("invalid m state in scheduler");
} }
// Find (or wait for) g to run. Unlocks runtime·sched. // Find (or wait for) g to run. Unlocks runtime·sched.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment