up->state = Running;
up->mach = MACHP(m->machno);
m->proc = up;
+ //print("poolcheck sched %s\n", p->text);
+ //#include <pool.h>
+ //poolcheck(mainmem);
mmuswitch(up);
gotolabel(&up->sched);
}
p->s = up->s;
p->nerrlab = 0;
p->slash = up->slash;
- p->dot = up->dot;
+ p->dot = up->slash; /* unlike fork, do not inherit the dot for kprocs */
if(p->dot != nil)
incref(p->dot);
* reasoning.
*/
void
-procctl(Proc *p)
+procctl(void)
{
char *state;
ulong s;
- switch(p->procctl) {
+ switch(up->procctl) {
case Proc_exitbig:
spllo();
pprint("Killed: Insufficient physical memory\n");
pexit("Killed", 1);
case Proc_traceme:
- if(p->nnote == 0)
+ if(up->nnote == 0)
return;
/* No break */
case Proc_stopme:
- p->procctl = 0;
- state = p->psstate;
- p->psstate = "Stopped";
+ up->procctl = 0;
+ state = up->psstate;
+ up->psstate = "Stopped";
/* free a waiting debugger */
s = spllo();
- qlock(&p->debug);
- if(p->pdbg != nil) {
- wakeup(&p->pdbg->sleep);
- p->pdbg = nil;
+ qlock(&up->debug);
+ if(up->pdbg != nil) {
+ wakeup(&up->pdbg->sleep);
+ up->pdbg = nil;
}
- qunlock(&p->debug);
+ qunlock(&up->debug);
splhi();
- p->state = Stopped;
+ up->state = Stopped;
sched();
- p->psstate = state;
+ up->psstate = state;
splx(s);
return;
}
kp->procctl = Proc_exitbig;
for(i = 0; i < NSEG; i++) {
s = kp->seg[i];
- if(s != nil) {
- qlock(s);
- mfreeseg(s, s->base, (s->top - s->base)/BY2PG);
- qunlock(s);
+ if(s == nil)
+ continue;
+ switch(s->type & SG_TYPE){
+ case SG_SHARED:
+ case SG_PHYSICAL:
+ case SG_FIXED:
+ continue;
}
+ qlock(s);
+ mfreeseg(s, s->base, (s->top - s->base)/BY2PG);
+ qunlock(s);
}
qunlock(&kp->seglock);
}
n = perfticks();
per = n - m->perf.last;
m->perf.last = n;
- per = (m->perf.period*(HZ-1) + per)/HZ;
+ per = ((uvlong)m->perf.period*(HZ-1) + per)/HZ;
if(per != 0)
m->perf.period = per;
- m->perf.avg_inidle = (m->perf.avg_inidle*(HZ-1)+m->perf.inidle)/HZ;
+ m->perf.avg_inidle = ((uvlong)m->perf.avg_inidle*(HZ-1)+m->perf.inidle)/HZ;
m->perf.inidle = 0;
- m->perf.avg_inintr = (m->perf.avg_inintr*(HZ-1)+m->perf.inintr)/HZ;
+ m->perf.avg_inintr = ((uvlong)m->perf.avg_inintr*(HZ-1)+m->perf.inintr)/HZ;
m->perf.inintr = 0;
/* only one processor gets to compute system load averages */
*/
n = nrun;
nrun = 0;
- n = (nrdy+n)*1000;
- m->load = (m->load*(HZ-1)+n)/HZ;
+ n = (nrdy+n)*1000*100;
+ load = ((uvlong)load*(HZ-1)+n)/HZ;
+ m->load = load/100;
}
int