From f5d804c9da2b89ed0e4169bc76d3643ba1dee8eb Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Fri, 6 Jan 1995 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1995-01-06 --- pc/devastar.c | 6 +++--- port/auth.c | 4 +++- port/devpipe.c | 2 ++ port/devproc.c | 4 +--- port/portdat.h | 3 ++- port/proc.c | 32 +++++++++++++++----------------- port/sysproc.c | 14 ++++++++++---- 7 files changed, 36 insertions(+), 29 deletions(-) diff --git a/pc/devastar.c b/pc/devastar.c index c278bf7cd30d41d67d00bbc796915b83ee41d6a6..03c2a80102a26518242f02d0a665a5e0dd908181 100644 --- a/pc/devastar.c +++ b/pc/devastar.c @@ -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); diff --git a/port/auth.c b/port/auth.c index b694cd8e35dd87294017de92401dc7d3f1a9ecd9..2c2e3b4730fb3d250b2bcbd080f1628d862349d7 100644 --- a/port/auth.c +++ b/port/auth.c @@ -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){ /* diff --git a/port/devpipe.c b/port/devpipe.c index cef15394661feb1adcaf17022c34138d795ab650..d1857a54e3e9147dce21270e8ad9195e012324de 100644 --- a/port/devpipe.c +++ b/port/devpipe.c @@ -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) diff --git a/port/devproc.c b/port/devproc.c index 79a74c9d72659d164447666be83dde925ef4f1c2..9813bd97a22f43be4f41429c7bae1ceae6962959 100644 --- a/port/devproc.c +++ b/port/devproc.c @@ -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 */ diff --git a/port/portdat.h b/port/portdat.h index 13a0297394c127dbe34cb154179f7f596f1caf6d..e33273e3d4270b863cdf7923699c910ab35544f0 100644 --- a/port/portdat.h +++ b/port/portdat.h @@ -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 */ diff --git a/port/proc.c b/port/proc.c index 8527082377ea55425a85bec5f9154c29490c7fc5..e1fb2a12aa3098ce91299d0b5589e85d705fe376 100644 --- a/port/proc.c +++ b/port/proc.c @@ -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; diff --git a/port/sysproc.c b/port/sysproc.c index 51ba8dfb7b28ba8e0bf3960271088ccb3131b7a5..d27cd7bcd69adfe18bdbead01a3e96ef0d5de5fa 100644 --- a/port/sysproc.c +++ b/port/sysproc.c @@ -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; }