From a591740deb717f7fb255411da7102ffad889208e Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Thu, 15 Sep 1994 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1994-09-15 --- carrera/fns.h | 1 + port/auth.c | 2 ++ port/devproc.c | 12 +++++++++--- port/netif.c | 3 +++ port/portdat.h | 2 +- port/proc.c | 28 +++++++++++++--------------- port/sysproc.c | 4 +--- 7 files changed, 30 insertions(+), 22 deletions(-) diff --git a/carrera/fns.h b/carrera/fns.h index 86def8eb916d993710e7aab57314e4965e64bb52..2ce8eb5a8cc9df5cb1a0628970526fbb5ae7f764 100644 --- a/carrera/fns.h +++ b/carrera/fns.h @@ -62,6 +62,7 @@ void newstart(void); int newtlbpid(Proc*); void nonettoggle(void); void novme(int); +void ns16552install(void); void online(void); Block* prepend(Block*, int); void prflush(void); diff --git a/port/auth.c b/port/auth.c index 37c558295058cbfea408e4c818dc68ee0ceffa04..87db458b78beb614af4bd17fd64f022beb9d77f3 100644 --- a/port/auth.c +++ b/port/auth.c @@ -573,6 +573,7 @@ userwrite(char *a, int n) error(Eperm); memset(up->user, 0, NAMELEN); strcpy(up->user, "none"); + up->basepri = PriNormal; return n; } @@ -596,6 +597,7 @@ hostownerwrite(char *a, int n) error(Ebadarg); memmove(eve, buf, NAMELEN); memmove(up->user, buf, NAMELEN); + up->basepri = PriNormal; return n; } diff --git a/port/devproc.c b/port/devproc.c index 92202fbf7bd4fd6e1fab9138faf7980ec0a12028..cf4483b0f55b7d40ba948310622c2bae9b3703a1 100644 --- a/port/devproc.c +++ b/port/devproc.c @@ -27,7 +27,7 @@ enum Qwait, }; -#define STATSIZE (2*NAMELEN+12+7*12) +#define STATSIZE (2*NAMELEN+12+9*12) Dirtab procdir[] = { "ctl", {Qctl}, 0, 0000, @@ -396,6 +396,8 @@ procread(Chan *c, void *va, long n, ulong offset) l += s->top - s->base; } readnum(0, statbuf+j+NUMSIZE*6, NUMSIZE, l>>10, NUMSIZE); + readnum(0, statbuf+j+NUMSIZE*7, NUMSIZE, p->basepri, NUMSIZE); + readnum(0, statbuf+j+NUMSIZE*8, NUMSIZE, p->priority, NUMSIZE); memmove(a, statbuf+offset, n); return n; @@ -739,8 +741,12 @@ procctlreq(Proc *p, char *va, int n) if(n < 4) error(Ebadctl); i = atoi(buf+4); - if(i < 0 || i >= Nrq) - error(Ebadctl); + if(i < 0) + i = 0; + if(i >= Nrq) + i = Nrq - 1; + if(i < p->basepri && !iseve()) + error(Eperm); p->basepri = i; } else diff --git a/port/netif.c b/port/netif.c index 81b80e9d726833186552236622cc802fa51b2b85..c579d11f8a9e9b846e8259a9e6f411e899cc1ab7 100644 --- a/port/netif.c +++ b/port/netif.c @@ -255,6 +255,9 @@ netifclose(Netif *nif, Chan *c) Netfile *f; int t; + if((c->flag & COPEN) == 0) + return; + t = NETTYPE(c->qid.path); if(t != Ndataqid && t != Nctlqid) return; diff --git a/port/portdat.h b/port/portdat.h index 4ed1872be2b29dbf6565046a18861d653871ab03..da6ba9ae5c3221a964c8fae81e8a756962642a07 100644 --- a/port/portdat.h +++ b/port/portdat.h @@ -502,7 +502,7 @@ enum Nrq = 20, /* number of scheduler priority levels */ PriNormal = 10, /* base priority for normal processes */ - PriRoot = 5, /* base priority for root processes */ + PriRoot = 13, /* base priority for root processes */ }; struct Proc diff --git a/port/proc.c b/port/proc.c index b5c208c9582999b0e5305b1b7df199588e97d474..444edecd3774b2de445131d923c2930ac426733f 100644 --- a/port/proc.c +++ b/port/proc.c @@ -120,8 +120,8 @@ anyhigher(void) int x; x = lastreadied; - lastreadied = Nrq; - return nrdy && x <= up->priority; + lastreadied = 0; + return nrdy && x >= up->priority; } void @@ -133,8 +133,8 @@ ready(Proc *p) s = splhi(); if(p->state == Running){ - if(p->priority < Nrq-1) - p->priority++; + if(p->priority > 0) + p->priority--; } else p->priority = p->basepri; rq = &runq[p->priority]; @@ -150,7 +150,7 @@ ready(Proc *p) nrdy++; p->readyticks = m->ticks; p->state = Ready; - if(lastreadied > p->priority) + if(p->priority > lastreadied) lastreadied = p->priority; unlock(runq); splx(s); @@ -165,18 +165,16 @@ runproc(void) loop: /* - * find a process at level 0 (programs from '/' file system), - * one that last ran on this processor (affinity), + * find a process that last ran on this processor (affinity), * or one that hasn't moved in a while (load balancing). */ spllo(); for(;;){ - for(rq = runq; rq < &runq[Nrq]; rq++){ + for(rq = &runq[Nrq-1]; rq >= runq; rq--){ if(rq->head == 0) continue; for(p = rq->head; p; p = p->rnext){ - if(rq == runq || p->mp == m || - m->ticks - p->movetime > HZ/2) + if(p->mp == m || m->ticks - p->movetime > HZ/2) goto found; } } @@ -189,7 +187,7 @@ found: l = 0; for(p = rq->head; p; p = p->rnext){ - if(rq == runq || p->mp == m || m->ticks - p->movetime > HZ/2) + if(p->mp == m || m->ticks - p->movetime > HZ/2) break; l = p; } @@ -198,7 +196,7 @@ found: * p->mach==0 only when process state is saved */ if(p == 0 || p->mach){ - unlock(&runq[0]); + unlock(runq); goto loop; } if(p->rnext == 0) @@ -226,13 +224,13 @@ canpage(Proc *p) int ok = 0; splhi(); - lock(&runq[0]); + lock(runq); /* Only reliable way to see if we are Running */ if(p->mach == 0) { p->newtlb = 1; ok = 1; } - unlock(&runq[0]); + unlock(runq); spllo(); return ok; @@ -740,7 +738,7 @@ 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++){ + for(rq = &runq[Nrq-1]; rq >= runq; rq--){ if(rq->head == 0) continue; print("rq%d:", rq-runq); diff --git a/port/sysproc.c b/port/sysproc.c index cd824976af0d02d3329f5b20cf2f87317560e724..e8ca8e57754e311ac8d9498d13f7b7acd4edfb0a 100644 --- a/port/sysproc.c +++ b/port/sysproc.c @@ -394,12 +394,10 @@ sysexec(ulong *arg) relocateseg(s, USTKTOP-TSTKTOP); /* - * '/' processes are high priority (hack to make /ip more responsive) + * '/' processes are higher priority (hack to make /ip more responsive). */ if(devchar[tc->type] == L'/') up->basepri = PriRoot; - else - up->basepri = PriNormal; up->priority = up->basepri; poperror(); close(tc);