From 9f9c4529f0dd1f46f100c09b8f0e6e205f649508 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Wed, 4 Jan 1995 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1995-01-04 --- carrera/clock.c | 23 +------------ carrera/trap.c | 2 +- pc/clock.c | 17 +--------- port/devcons.c | 19 ----------- port/portfns.h | 1 + port/proc.c | 89 ++++++++++++++++++++++++++++++++++++++++--------- port/qio.c | 3 ++ port/qlock.c | 4 +++ power/clock.c | 22 ++---------- 9 files changed, 87 insertions(+), 93 deletions(-) diff --git a/carrera/clock.c b/carrera/clock.c index 0b7c8294d4078d69a57410ebac008787cea067fd..805afc2d33ab5badf9239be5175f05857f9d8914 100644 --- a/carrera/clock.c +++ b/carrera/clock.c @@ -47,34 +47,13 @@ clockinit(void) void clock(Ureg *ur) { - Proc *p; - int i, nrun; - wrcompare(rdcount()+(m->speed*1000000)/HZ); m->ticks++; if(m->proc) m->proc->pc = ur->pc; - nrun = 0; - if(m->machno == 0) { - p = m->proc; - if(p) { - nrun++; - p->time[p->insyscall]++; - } - for(i=1; iproc; - if(p) { - p->time[p->insyscall]++; - nrun++; - } - } - } - nrun = (nrdy+nrun)*1000; - m->load = (m->load*19+nrun)/20; - } + accounttime(); ifjab(); diff --git a/carrera/trap.c b/carrera/trap.c index 83720ac35163e8002ca2381c9e723fdd425c521c..a41685f2716e138bf36d74d611ef8ef6a9242315 100644 --- a/carrera/trap.c +++ b/carrera/trap.c @@ -600,8 +600,8 @@ noted(Ureg **urp, ulong arg0) qunlock(&up->debug); pexit("Suicide", 0); } - splhi(); qunlock(&up->debug); + splhi(); rfnote(urp); break; diff --git a/pc/clock.c b/pc/clock.c index 0125a5aaeb4cc3427962df263d20bb15b3d7e970..713f6efe2db9333190f94f19197ce9e9db36f84d 100644 --- a/pc/clock.c +++ b/pc/clock.c @@ -35,30 +35,15 @@ static int cpuidax, cpuiddx; static void clock(Ureg *ur, void *arg) { - Proc *p; - int nrun = 0; - USED(arg); m->ticks++; + accounttime(); checkalarms(); hardclock(); uartclock(); - /* - * process time accounting - */ - p = m->proc; - if(p){ - nrun = 1; - p->pc = ur->pc; - if (p->state==Running) - p->time[p->insyscall]++; - } - nrun = (nrdy+nrun)*1000; - MACHP(0)->load = (MACHP(0)->load*19+nrun)/20; - if(up && up->state == Running){ if(anyready()) sched(); diff --git a/port/devcons.c b/port/devcons.c index 1294b0f4178542c2f8cde8397b30e8c7e0cdc292..96c6739a8368f80d93547eed158488fbcc4bb7cd 100644 --- a/port/devcons.c +++ b/port/devcons.c @@ -11,7 +11,6 @@ Queue *mouseq; Queue *kbdq; /* unprocessed console input */ Queue *lineq; /* processed console input */ Queue *printq; /* console output */ -Queue *klogq; static struct { @@ -33,8 +32,6 @@ char sysname[NAMELEN]; void printinit(void) { - klogq = qopen(32*1024, 0, 0, 0); - qnoblock(klogq, 1); lineq = qopen(2*1024, 0, 0, 0); qnoblock(lineq, 1); } @@ -127,17 +124,6 @@ fprint(int fd, char *fmt, ...) /* needed so we can use user-level libg */ return n; } -int -kprint(char *fmt, ...) -{ - char buf[PRINTSIZE]; - int n; - - n = doprint(buf, buf+sizeof(buf), fmt, (&fmt+1)) - buf; - qwrite(klogq, buf, n); - return n; -} - void panic(char *fmt, ...) { @@ -327,7 +313,6 @@ enum{ Qkey, Qhostdomain, Qhostowner, - Qklog, Qlights, Qmsec, Qnoise, @@ -354,7 +339,6 @@ Dirtab consdir[]={ "hostowner", {Qhostowner}, NAMELEN, 0664, "hz", {Qhz}, NUMSIZE, 0666, "key", {Qkey}, DESKEYLEN, 0622, - "klog", {Qklog}, 0, 0444, "lights", {Qlights}, 0, 0220, "msec", {Qmsec}, NUMSIZE, 0444, "noise", {Qnoise}, 0, 0220, @@ -604,9 +588,6 @@ consread(Chan *c, void *buf, long n, ulong offset) case Qnull: return 0; - case Qklog: - return qread(klogq, buf, n); - case Qmsec: return readnum(offset, buf, n, TK2MS(MACHP(0)->ticks), NUMSIZE); diff --git a/port/portfns.h b/port/portfns.h index 51c2f850b8a8ac91cfb4d5eb04714a2f56f173d0..a14404d77e90328e5ff5fa24aed8e8d3006c2e35 100644 --- a/port/portfns.h +++ b/port/portfns.h @@ -1,3 +1,4 @@ +void accounttime(void); void addrootfile(char*, uchar*, ulong); void alarmkproc(void*); Block* allocb(int); diff --git a/port/proc.c b/port/proc.c index 17da34fc641a77bb4ff2b172f54db782b03e45bc..6561f77cfee306f193bcce0c2676736311e686ca 100644 --- a/port/proc.c +++ b/port/proc.c @@ -31,6 +31,7 @@ typedef struct int nrdy; Schedq runq; +int priconst[NiceMax]; char *statename[] = { /* BUG: generate automatically */ @@ -60,7 +61,6 @@ schedinit(void) /* never returns */ ready(up); break; case Moribund: - up->pid = 0; up->state = Dead; /* * Holding locks from pexit: @@ -70,9 +70,6 @@ schedinit(void) /* never returns */ up->qnext = procalloc.free; procalloc.free = up; - - unlock(&palloc); - qunlock(&up->debug); unlock(&procalloc); break; } @@ -300,7 +297,6 @@ procwired(Proc *p) if(nwired[i] < nwired[bm]) bm = i; p->wired = MACHP(bm); -print("pid %d wired to machine %d\n", p->pid, p->wired->machno); } void @@ -316,6 +312,14 @@ procinit0(void) /* bad planning - clashes with devproc.c */ for(i=0; iqnext = p+1; p->qnext = 0; + + /* + * set up priority increments + * normal priority sb about 1000/HZ + * highest pri (lowest number) sb about 0 + */ + for(i=0; idebug); - if(r = p->r) { + r = p->r; + if(r != 0) { for(;;) { s = splhi(); if(canlock(r)) @@ -649,9 +654,12 @@ pexit(char *exitstr, int freemem) addbroken(up); es = &up->seg[NSEG]; - for(s = up->seg; s < es; s++) - if(*s) + for(s = up->seg; s < es; s++) { + if(*s) { putseg(*s); + *s = 0; + } + } lock(&up->exl); /* Prevent my children from leaving waits */ up->pid = 0; @@ -662,18 +670,16 @@ pexit(char *exitstr, int freemem) free(f); } - /* - * sched() cannot wait on these locks - */ - qlock(&up->debug); /* release debuggers */ + qlock(&up->debug); if(up->pdbg) { wakeup(&up->pdbg->sleep); up->pdbg = 0; } + qunlock(&up->debug); + /* Sched must not loop for this lock */ lock(&procalloc); - lock(&palloc); up->state = Moribund; sched(); @@ -898,7 +904,7 @@ killbig(void) l = 0; for(i=1; iseg[i]; - if(s) + if(s != 0) l += s->top - s->base; } if(l > max) { @@ -906,8 +912,15 @@ killbig(void) max = l; } } - print("%d: %s killed because no swap configured\n", kp->pid, kp->text); kp->procctl = Proc_exitme; + for(i = 0; i < NSEG; i++) { + s = kp->seg[i]; + if(s != 0 && canqlock(&s->lk)) { + mfreeseg(s, s->base, (s->top - s->base)/BY2PG); + qunlock(&s->lk); + } + } + print("%d: %s killed because no swap configured\n", kp->pid, kp->text); postnote(kp, 1, "killed: proc too big", NExit); } @@ -925,3 +938,49 @@ renameuser(char *old, char *new) if(strcmp(old, p->user) == 0) memmove(p->user, new, NAMELEN); } + +/* + * time accounting called by clock() splhi'd + */ +void +accounttime(void) +{ + Proc *p; + int i, pri; + static int nrun, m0ticks; + + p = m->proc; + if(p) { + nrun++; + p->time[p->insyscall]++; + p->pri += priconst[p->nice]; + } + + /* only one processor gets to compute system load averages */ + if(m->machno != 0) + return; + + /* calculate decaying load average */ + pri = nrun; + nrun = 0; + + pri = (nrdy+pri)*1000; + m->load = (m->load*19+pri)/20; + + /* + * decay per-process cpu usage + * pri = (7/8)*pri twice per second + * tc = (7/8)^2/(1-(7/8)^2) = 3.27 sec + */ + m0ticks--; + if(m0ticks <= 0) { + m0ticks = HZ/2; + p = proctab(0); + for(i=conf.nproc-1; i!=0; i--,p++) + if(p->state != Dead) { + pri = p->pri; + pri -= pri >> 3; + p->pri = pri; + } + } +} diff --git a/port/qio.c b/port/qio.c index 6d2eda17a0f971a3369c5396955669d01a3c0f8a..28d87ce14b84e9ee4c56ac6d8f879044bd5b76c9 100644 --- a/port/qio.c +++ b/port/qio.c @@ -520,6 +520,9 @@ qwrite(Queue *q, void *vp, int len) dowakeup = 0; + if((getstatus()&IE) == 0) + print("qwrite hi %lux\n", getcallerpc(q)); + if(waserror()){ qunlock(&q->wlock); nexterror(); diff --git a/port/qlock.c b/port/qlock.c index 7b7fbab557decc94227e4225425f5b2d6e409af0..33c0269a355e2ebcc139fbedd7c42c7042385338 100644 --- a/port/qlock.c +++ b/port/qlock.c @@ -10,6 +10,8 @@ qlock(QLock *q) { Proc *p, *mp; + if((getstatus()&IE)==0) + print("qlock hi %lux\n", getcallerpc(q)); lock(&q->use); if(!q->locked) { q->locked = 1; @@ -48,6 +50,8 @@ qunlock(QLock *q) { Proc *p; + if((getstatus()&IE)==0) + print("qunlock hi %lux\n", getcallerpc(q)); lock(&q->use); p = q->head; if(p) { diff --git a/power/clock.c b/power/clock.c index 53d06f4d2218be1fa3a484feb46aa717217a103c..44d3937990eb0ae37fcf5b86e02aa3ed12bb091f 100644 --- a/power/clock.c +++ b/power/clock.c @@ -71,8 +71,7 @@ clockinit(void) void clock(Ureg *ur) { - Proc *p; - int i, nrun; + int i; if((ur->cause&INTR2) == 0) { if(ur->cause & INTR4) { @@ -89,24 +88,7 @@ clock(Ureg *ur) if(m->proc) m->proc->pc = ur->pc; - if(m->machno == 0) { - p = m->proc; - if(p) { - nrun++; - p->time[p->insyscall]++; - } - for(i=1; iproc; - if(p) { - p->time[p->insyscall]++; - nrun++; - } - } - } - nrun = (nrdy+nrun)*1000; - m->load = (m->load*19+nrun)/20; - } + accounttime(); duartslave(); if((active.machs&(1<machno)) == 0) return;