M carrera/fns.h => carrera/fns.h +1 -0
@@ 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);
M port/auth.c => port/auth.c +2 -0
@@ 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;
}
M port/devproc.c => port/devproc.c +9 -3
@@ 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
M port/netif.c => port/netif.c +3 -0
@@ 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;
M port/portdat.h => port/portdat.h +1 -1
@@ 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
M port/proc.c => port/proc.c +13 -15
@@ 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);
M port/sysproc.c => port/sysproc.c +1 -3
@@ 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);