From 71c3611fb53d5286ad1d0f358dc84d3393919b56 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Thu, 28 Jul 1994 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1994-07-28 --- boot/boot.c | 3 +- carrera/dat.h | 4 +- carrera/fns.h | 4 +- carrera/main.c | 9 ----- carrera/mmu.c | 9 ++++- pc/dat.h | 3 +- pc/fns.h | 2 - port/cache.c | 23 +++++++++--- port/devlance.c | 11 ++++-- port/portdat.h | 2 - port/proc.c | 99 +++++++++++++++++++++++++++++++++++-------------- port/sysproc.c | 4 ++ power/dat.h | 3 +- power/fns.h | 2 - 14 files changed, 114 insertions(+), 64 deletions(-) diff --git a/boot/boot.c b/boot/boot.c index 229fc0edf78f69e0ba6ab8587e75ca16f434301e..c6c19ca0bedcf771cdbd16226d001e706b1f50ff 100644 --- a/boot/boot.c +++ b/boot/boot.c @@ -44,10 +44,11 @@ boot(int argc, char *argv[]) open("#c/cons", OWRITE); open("#c/cons", OWRITE); bind("#c", "/dev", MAFTER); + #ifdef DEBUG print("argc=%d\n", argc); for(fd = 0; fd < argc; fd++) - print("%s ", argv[fd]); + print("%lux %s ", argv[fd], argv[fd]); print("\n"); #endif DEBUG diff --git a/carrera/dat.h b/carrera/dat.h index 2dd1b7c607df9427d76b1afb3294e3008d9a19bf..fbfa8e6a669052eceabe1ee905daf450289471cd 100644 --- a/carrera/dat.h +++ b/carrera/dat.h @@ -98,7 +98,6 @@ struct Mach int tlbpurge; /* MUST BE SIXTH */ /* the following are safe to move */ - ulong otlbfault; /* tlbfault at last sched */ ulong ticks; /* of the clock since boot time */ Label sched; /* scheduler wakeup */ int lastpid; /* last pid allocated on this machine */ @@ -110,8 +109,7 @@ struct Mach uchar ktlbnext; int speed; /* cpu speed */ ulong delayloop; /* for the delay() routine */ - Schedq hiq; - Schedq loq; + int nrdy; int pfault; int cs; diff --git a/carrera/fns.h b/carrera/fns.h index 331ac7175437bc2bd7ec14cf4bfbed26e39e0284..fbdf3fd26c96de04d4f8742b847849eb2f1781fd 100644 --- a/carrera/fns.h +++ b/carrera/fns.h @@ -3,10 +3,8 @@ void DEBUG(void); void addportintr(int(*)(void)); -#define affinity(x) m void allflush(void*, ulong); void arginit(void); -#define balance(x) m int busprobe(ulong); void cleancache(void); void clearmmucache(void); @@ -70,7 +68,7 @@ void prflush(void); ulong prid(void); void printinit(void); #define procrestore(p) -void procsave(Proc*); +#define procsave(p) #define procsetup(p) ((p)->fpstate = FPinit) void purgetlb(int); int putnvram(ulong, void*, int); diff --git a/carrera/main.c b/carrera/main.c index 58cc1bb737b5d4c08594957b44fe6ec5389a7c2a..48dcdd191ca998f9d8b2bf8a2b8e85f9431a6e05 100644 --- a/carrera/main.c +++ b/carrera/main.c @@ -452,15 +452,6 @@ confinit(void) conf.copymode = 0; /* copy on write */ } -void -procsave(Proc *p) -{ - USED(p); - - /* keep track of tlbfaults */ - m->otlbfault = m->tlbfault; -} - void buzz(int f, int d) { diff --git a/carrera/mmu.c b/carrera/mmu.c index 534fb365dc09a18d40f2cf4c5773acfc251282a9..7643eaba7055e79093f36009369543500c417479 100644 --- a/carrera/mmu.c +++ b/carrera/mmu.c @@ -77,8 +77,13 @@ kmap(Page *pg) s = splhi(); lock(&kmaplock); - if(kmapfree == 0) - panic("out of kmap"); + if(kmapfree == 0) { + unlock(&kmaplock); + kmapinval(); /* try and free some */ + lock(&kmaplock); + if(kmapfree == 0) + panic("out of kmap"); + } k = kmapfree; kmapfree = k->next; diff --git a/pc/dat.h b/pc/dat.h index de1f966f58f0a4759da0408a5618b62a3813ab4d..0ccf03e826f138c9a438fd3f7165e14386f03ef3 100644 --- a/pc/dat.h +++ b/pc/dat.h @@ -125,8 +125,7 @@ struct Mach Label sched; /* scheduler wakeup */ Lock alarmlock; /* access to alarm list */ void *alarm; /* alarms bound to this clock */ - Schedq hiq; - Schedq loq; + int nrdy; int tlbfault; int tlbpurge; diff --git a/pc/fns.h b/pc/fns.h index 84b2b52e29f143e93cbeca7a9c1e1a15908f9c9d..c73bbadca4f881fe97bd17e16d5eac11790fea57 100644 --- a/pc/fns.h +++ b/pc/fns.h @@ -2,8 +2,6 @@ void aamloop(int); void addconf(char*, char*); -#define affinity(x) m -#define balance(x) m void bbinit(void); void bigcursor(void); void bootargs(ulong); diff --git a/port/cache.c b/port/cache.c index 307775b14341e4d842afd38bd064887d33bad732..5f61f76ec8c53aefba0cc2b6e2c1ad8478201780 100644 --- a/port/cache.c +++ b/port/cache.c @@ -268,6 +268,11 @@ cread(Chan *c, uchar *buf, int len, ulong offset) return total; } + o = offset - e->start; + l = len; + if(l > e->len-o) + l = e->len-o; + k = kmap(p); if(waserror()) { kunmap(k); @@ -276,15 +281,11 @@ cread(Chan *c, uchar *buf, int len, ulong offset) nexterror(); } - o = offset - e->start; - l = len; - if(l > e->len-o) - l = e->len-o; - memmove(buf, (uchar*)VA(k) + o, l); poperror(); kunmap(k); + putpage(p); buf += l; @@ -337,7 +338,12 @@ cchain(uchar *buf, ulong offset, int len, Extent **tail) p->daddr = e->bid; k = kmap(p); + if(waserror()) { /* buf may be virtual */ + kunmap(k); + nexterror(); + } memmove((void*)VA(k), buf, l); + poperror(); kunmap(k); cachepage(p, &fscache); @@ -366,7 +372,14 @@ cpgmove(Extent *e, uchar *buf, int boff, int len) return 0; k = kmap(p); + if(waserror()) { /* Since buf may be virtual */ + kunmap(k); + nexterror(); + } + memmove((uchar*)VA(k)+boff, buf, len); + + poperror(); kunmap(k); putpage(p); diff --git a/port/devlance.c b/port/devlance.c index 7e23b27fc35b999de60e099b10ee986d845550a0..a36e44cdcff15c01ba40361d503fe45e593d6f2b 100644 --- a/port/devlance.c +++ b/port/devlance.c @@ -158,6 +158,7 @@ lancereset(void) */ *l.rap = 0; *l.rdp = STOP; + l.wedged = 1; } /* @@ -260,6 +261,12 @@ lancestart(int mode) wbflush(); *l.rap = 0; *l.rdp = INEA|INIT|STRT; /**/ + + for(i = 0; i < 1000; i++) + if(l.wedged == 0) + break; + + qunlock(&l.tlock); } void @@ -294,10 +301,8 @@ lanceintr(void) } } - if(csr & IDON){ + if(csr & IDON) l.wedged = 0; - qunlock(&l.tlock); - } /* * the lance turns off if it gets strange output errors diff --git a/port/portdat.h b/port/portdat.h index f6bdaa6e3f573e0c448ae8942a05a1794cfbe4f6..cc12d92595f03a80ea308e86300c9147dc1c55c7 100644 --- a/port/portdat.h +++ b/port/portdat.h @@ -577,8 +577,6 @@ struct Proc int (*notify)(void*, char*); Mach *mp; /* machine this process last ran on */ - ulong affinity; /* affinity counter for that mach */ - ulong movetime; /* ticks when proc was last reassigned */ ulong priority; void *ureg; /* User registers for notes */ diff --git a/port/proc.c b/port/proc.c index 4fd3ecf952663f4502f9da7fa817ca15563d8a7b..d7bef4bdaa07cacc5515a755a2eef7e2afd6ead9 100644 --- a/port/proc.c +++ b/port/proc.c @@ -21,8 +21,14 @@ struct Waitq *free; }waitqalloc; + +enum +{ + Nrq = 5, /* number of run queues */ +}; + int nrdy; -Schedq runhiq; /* for hi priority process, don't bother with affinity */ +Schedq runq[Nrq]; char *statename[] = { /* BUG: generate automatically */ @@ -102,7 +108,13 @@ sched(void) int anyready(void) { - return m->hiq.head != 0 || m->loq.head != 0; + Schedq *rq; + + for(rq = runq; rq < &runq[Nrq]; rq++) + if(rq->head) + return 1; + + return 0; } void @@ -113,14 +125,17 @@ ready(Proc *p) s = splhi(); - if(p->priority) - rq = &runhiq; - else if(p->state == Running) - rq = &balance(p)->loq; - else - rq = &affinity(p)->hiq; + if(p->priority != 0){ + if(p->state == Running){ + if(p->priority < Nrq-1) + p->priority++; + } else + p->priority = 1; + } +if(p->priority < 0 || p->priority >= Nrq) panic("ready"); + rq = &runq[p->priority]; - lock(&runhiq); + lock(runq); p->rnext = 0; if(rq->tail) rq->tail->rnext = p; @@ -130,7 +145,7 @@ ready(Proc *p) rq->n++; nrdy++; p->state = Ready; - unlock(&runhiq); + unlock(runq); splx(s); } @@ -138,38 +153,59 @@ Proc* runproc(void) { Schedq *rq; - Proc *p; + Proc *p, *l; loop: + + /* + * find highest priority queue with runnable process + */ spllo(); - while(runhiq.head == 0 && m->hiq.head == 0 && m->loq.head == 0) - ; + for(rq = runq; rq < &runq[Nrq]; rq++) + if(rq->head) + break; + if(rq == &runq[Nrq]) + goto loop; splhi(); - lock(&runhiq); - if(runhiq.head) - rq = &runhiq; - else if(m->hiq.head) - rq = &m->hiq; - else - rq = &m->loq; + lock(runq); + + /* + * affinity: look for a process last run on this processor, + * otherwise, take first in list. + */ + l = 0; + for(p = rq->head; p; p = p->rnext){ + if(p->mp == m) + break; + l = p; + } + if(p == 0){ + l = 0; + p = rq->head; + } - p = rq->head; - /* p->mach==0 only when process state is saved */ + /* + * p->mach==0 only when process state is saved + */ if(p == 0 || p->mach){ - unlock(&runhiq); + unlock(&runq[0]); goto loop; } if(p->rnext == 0) - rq->tail = 0; - rq->head = p->rnext; + rq->tail = l; + if(l) + l->rnext = p->rnext; + else + rq->head = p->rnext; rq->n--; nrdy--; if(p->state != Ready) print("runproc %s %d %s\n", p->text, p->pid, statename[p->state]); - unlock(&runhiq); + unlock(runq); p->state = Scheding; + p->mp = m; return p; } @@ -179,13 +215,13 @@ canpage(Proc *p) int ok = 0; splhi(); - lock(&runhiq); + lock(&runq[0]); /* Only reliable way to see if we are Running */ if(p->mach == 0) { p->newtlb = 1; ok = 1; } - unlock(&runhiq); + unlock(&runq[0]); spllo(); return ok; @@ -672,6 +708,7 @@ procdump(void) char *s; Proc *p; ulong bss; + Schedq *rq; for(i=0; ipid, p->text, p->pc, s, statename[p->state], p->time[0], p->time[1], bss); } + for(rq = runq; rq < &runq[Nrq]; rq++){ + print("rq%d:", rq-runq); + for(p = rq->head; p; p = p->rnext) + print(" %d", p->pid); + print("\n"); + } } void diff --git a/port/sysproc.c b/port/sysproc.c index f877e7bc4c419ad95ea5aea26b07664f5dc12338..46727502bc65b407d57fbb4c442f6e818a17067e 100644 --- a/port/sysproc.c +++ b/port/sysproc.c @@ -165,6 +165,8 @@ sysrfork(ulong *arg) * (i.e. has bad properties) and has to be discarded. */ flushmmu(); + p->priority = up->priority; + p->mp = up->mp; ready(p); return pid; } @@ -384,6 +386,8 @@ sysexec(ulong *arg) * '/' processes are high priority (hack to make /ip more responsive) */ if(devchar[tc->type] == L'/') + up->priority = 0; + else up->priority = 1; close(tc); diff --git a/power/dat.h b/power/dat.h index e0a1f4f5f83a7af63f06070551cbd6176dfdf893..db21799aefb14ae8a70bfe625982b478cb3980a7 100644 --- a/power/dat.h +++ b/power/dat.h @@ -115,8 +115,7 @@ struct Mach int intr; int ledval; /* value last written to LED */ int otlbfault; - Schedq hiq; - Schedq loq; + int nrdy; int stack[1]; }; diff --git a/power/fns.h b/power/fns.h index 0dfb826635ab9371fff9df15455b13ad6dae81e8..656d93e2ab3dd187f5aa45c80a41ad0eea75513e 100644 --- a/power/fns.h +++ b/power/fns.h @@ -1,8 +1,6 @@ #include "../port/portfns.h" -#define affinity(x) m void arginit(void); -#define balance(x) m void clearmmucache(void); void clock(Ureg*); void clockinit(void);