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;
}
error(buf);
}
+ulong
+procpagecount(Proc *p)
+{
+ Segment *s;
+ ulong pages;
+ int i;
+
+ eqlock(&p->seglock);
+ if(waserror()){
+ qunlock(&p->seglock);
+ nexterror();
+ }
+ pages = 0;
+ for(i=0; i<NSEG; i++){
+ if((s = p->seg[i]) != nil){
+ eqlock(s);
+ pages += mcountseg(s);
+ qunlock(s);
+ }
+ }
+ qunlock(&p->seglock);
+ poperror();
+
+ return pages;
+}
+
void
killbig(char *why)
{
kp = nil;
ep = procalloc.arena+conf.nproc;
for(p = procalloc.arena; p < ep; p++) {
- if(p->state == Dead || p->kp || !canqlock(&p->seglock))
+ if(p->state == Dead || p->kp)
continue;
- l = 0;
- for(i=1; i<NSEG; i++) {
- s = p->seg[i];
- if(s == nil || !canqlock(s))
- continue;
- l += mcountseg(s);
- qunlock(s);
- }
- qunlock(&p->seglock);
- if(l > max && ((p->procmode&0222) || strcmp(eve, p->user)!=0)) {
+ if((p->noswap || (p->procmode & 0222) == 0) && strcmp(eve, p->user) == 0)
+ continue;
+ l = procpagecount(p);
+ if(l > max){
kp = p;
max = l;
}
}
- if(kp == nil || !canqlock(&kp->seglock))
+ if(kp == nil)
return;
print("%lud: %s killed: %s\n", kp->pid, kp->text, why);
+ qlock(&kp->seglock);
for(p = procalloc.arena; p < ep; p++) {
if(p->state == Dead || p->kp)
continue;
kp->procctl = Proc_exitbig;
for(i = 0; i < NSEG; i++) {
s = kp->seg[i];
- if(s != nil && canqlock(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