M boot/boot.c => boot/boot.c +2 -1
@@ 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
M carrera/dat.h => carrera/dat.h +1 -3
@@ 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;
M carrera/fns.h => carrera/fns.h +1 -3
@@ 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);
M carrera/main.c => carrera/main.c +0 -9
@@ 453,15 453,6 @@ confinit(void)
}
void
-procsave(Proc *p)
-{
- USED(p);
-
- /* keep track of tlbfaults */
- m->otlbfault = m->tlbfault;
-}
-
-void
buzz(int f, int d)
{
USED(f);
M carrera/mmu.c => carrera/mmu.c +7 -2
@@ 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;
M pc/dat.h => pc/dat.h +1 -2
@@ 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;
M pc/fns.h => pc/fns.h +0 -2
@@ 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);
M port/cache.c => port/cache.c +18 -5
@@ 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);
M port/devlance.c => port/devlance.c +8 -3
@@ 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
M port/portdat.h => port/portdat.h +0 -2
@@ 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 */
M port/proc.c => port/proc.c +71 -28
@@ 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; i<conf.nproc; i++) {
p = &procalloc.arena[i];
@@ 688,6 725,12 @@ procdump(void)
p->pid, 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
M port/sysproc.c => port/sysproc.c +4 -0
@@ 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);
M power/dat.h => power/dat.h +1 -2
@@ 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];
};
M power/fns.h => power/fns.h +0 -2
@@ 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);