M pc/devastar.c => pc/devastar.c +3 -3
@@ 411,14 411,14 @@ astarreset(void)
}
/* defaults */
- if(a->mem == 0)
- a->mem = 0xD4000;
if(a->irq == 0)
a->irq = 15;
a->id = i;
- if(getisa(a->mem, Pagesize, 0) == 0)
+ a->mem = getisa(a->mem, Pagesize, Pagesize);
+ if(a->mem == 0)
panic("astarreset: %lux", a->mem);
+ a->mem & ~KZERO;
if(astarsetup(a) < 0){
xfree(a);
M port/auth.c => port/auth.c +3 -1
@@ 124,8 124,10 @@ sysfsession(ulong *arg)
unlock(c);
/* back off if someone else is doing an fsession */
- while(!canlock(&s->send))
+ while(!canlock(&s->send)) {
+ up->yield = 1;
sched();
+ }
if(s->valid == 0){
/*
M port/devpipe.c => port/devpipe.c +2 -0
@@ 302,6 302,8 @@ pipewrite(Chan *c, void *va, long n, ulong offset)
USED(offset);
+ if((getstatus()&IE) == 0)
+ print("pipewrite hi %lux\n", getcallerpc(c));
if(waserror()) {
/* avoid notes when pipe is a mounted queue */
if((c->flag & CMSG) == 0)
M port/devproc.c => port/devproc.c +1 -3
@@ 815,10 815,8 @@ procctlmemio(Proc *p, ulong offset, int n, void *va, int read)
b += offset&(BY2PG-1);
if(read == 1)
memmove(a, b, n);
- else {
+ else
memmove(b, a, n);
- dcflush(b, n);
- }
kunmap(k);
/* Ensure the process sees text page changes */
M port/portdat.h => port/portdat.h +2 -1
@@ 586,7 586,8 @@ struct Proc
Mach *wired; /* machine this process must run on */
int pri; /* scheduling priority - low is high priority */
- int nice; /* time-passing algorithm - low is high priority */
+ short nice; /* time-passing algorithm - low is high priority */
+ short yield; /* force one lap in the runq */
void *ureg; /* User registers for notes */
void *dbgreg; /* User registers for devproc */
M port/proc.c => port/proc.c +15 -17
@@ 119,7 119,7 @@ anyhigher(void)
for(p=runq.head; p; p=p->rnext)
if(p->pri < pri)
if(p->wired == 0 || p->wired == m)
- return runq.n;
+ return 1;
return 0;
}
@@ 152,18 152,12 @@ loop:
spllo();
/* look for potential proc while not locked */
- for(p=runq.head; p; p=p->rnext) {
+ for(p = runq.head; p; p=p->rnext) {
/*
- * state is not saved
+ * state is not saved or wired to another machine
*/
- if(p->mach)
- continue;
- /*
- * wired to another machine
- */
- if(p->wired && p->wired != m)
- continue;
- break;
+ if(!(p->mach || (p->wired && p->wired != m)))
+ break;
}
if(p == 0)
goto loop;
@@ 173,12 167,14 @@ loop:
/* find best proc while locked */
bp = 0;
- for(p=runq.head; p; p=p->rnext) {
- if(p->mach)
- continue;
- if(p->wired && p->wired != m)
+ for(p = runq.head; p; p=p->rnext) {
+ if(p->mach || (p->wired && p->wired != m))
continue;
- if(bp == 0 || p->pri < bp->pri)
+ if(bp == 0) {
+ p->yield = 0;
+ bp = p;
+ } else
+ if(p->yield == 0 && p->pri < bp->pri)
bp = p;
}
if(bp == 0) {
@@ 368,8 364,10 @@ sleep(Rendez *r, int (*f)(void*), void *arg)
int s;
sleep1(r, f, arg);
- if(up->notepending == 0)
+ if(up->notepending == 0) {
+ up->yield = 1;
sched(); /* notepending may go true while asleep */
+ }
if(up->notepending) {
up->notepending = 0;
M port/sysproc.c => port/sysproc.c +10 -4
@@ 462,11 462,17 @@ return0(void *a)
long
syssleep(ulong *arg)
{
- if(arg[0] == 0)
- sched();
- else
- tsleep(&up->sleep, return0, 0, arg[0]);
+ int n;
+ n = arg[0];
+ if(n == 0) {
+ up->yield = 1;
+ sched();
+ return 0;
+ }
+ if(MS2TK(n) == 0)
+ n = TK2MS(1);
+ tsleep(&up->sleep, return0, 0, n);
return 0;
}