~kris/9p

9hist

a591740deb717f7fb255411da7102ffad889208e — David du Colombier 32 years ago fedecc9
Plan 9 from Bell Labs 1994-09-15
7 files changed, 30 insertions(+), 22 deletions(-)

M carrera/fns.h
M port/auth.c
M port/devproc.c
M port/netif.c
M port/portdat.h
M port/proc.c
M port/sysproc.c
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);