~kris/9p

9hist

71c3611fb53d5286ad1d0f358dc84d3393919b56 — David du Colombier 32 years ago 0895365
Plan 9 from Bell Labs 1994-07-28
M boot/boot.c => boot/boot.c +2 -1
@@ 44,10 44,11 @@ boot(int argc, char *argv[])
	open("#c/cons", OWRITE);
	open("#c/cons", OWRITE);
	bind("#c", "/dev", MAFTER);

#ifdef DEBUG
	print("argc=%d\n", argc);
	for(fd = 0; fd < argc; fd++)
		print("%s ", argv[fd]);
		print("%lux %s ", argv[fd], argv[fd]);
	print("\n");
#endif DEBUG


M carrera/dat.h => carrera/dat.h +1 -3
@@ 98,7 98,6 @@ struct Mach
	int	tlbpurge;		/* MUST BE SIXTH */

	/* the following are safe to move */
	ulong	otlbfault;		/* tlbfault at last sched */
	ulong	ticks;			/* of the clock since boot time */
	Label	sched;			/* scheduler wakeup */
	int	lastpid;		/* last pid allocated on this machine */


@@ 110,8 109,7 @@ struct Mach
	uchar	ktlbnext;
	int	speed;			/* cpu speed */
	ulong	delayloop;		/* for the delay() routine */
	Schedq	hiq;
	Schedq	loq;
	int	nrdy;

	int	pfault;
	int	cs;

M carrera/fns.h => carrera/fns.h +1 -3
@@ 3,10 3,8 @@
void		DEBUG(void);

void		addportintr(int(*)(void));
#define		affinity(x) m
void		allflush(void*, ulong);
void		arginit(void);
#define		balance(x) m
int		busprobe(ulong);
void		cleancache(void);
void		clearmmucache(void);


@@ 70,7 68,7 @@ void		prflush(void);
ulong		prid(void);
void		printinit(void);
#define		procrestore(p)
void		procsave(Proc*);
#define		procsave(p)
#define		procsetup(p)		((p)->fpstate = FPinit)
void		purgetlb(int);
int		putnvram(ulong, void*, int);

M carrera/main.c => carrera/main.c +0 -9
@@ 453,15 453,6 @@ confinit(void)
}

void
procsave(Proc *p)
{
	USED(p);

	/* keep track of tlbfaults */
	m->otlbfault = m->tlbfault;
}

void
buzz(int f, int d)
{
	USED(f);

M carrera/mmu.c => carrera/mmu.c +7 -2
@@ 77,8 77,13 @@ kmap(Page *pg)
	s = splhi();
	lock(&kmaplock);

	if(kmapfree == 0)
		panic("out of kmap");
	if(kmapfree == 0) {
		unlock(&kmaplock);
		kmapinval();		/* try and free some */
		lock(&kmaplock);
		if(kmapfree == 0)
			panic("out of kmap");
	}

	k = kmapfree;
	kmapfree = k->next;

M pc/dat.h => pc/dat.h +1 -2
@@ 125,8 125,7 @@ struct Mach
	Label	sched;			/* scheduler wakeup */
	Lock	alarmlock;		/* access to alarm list */
	void	*alarm;			/* alarms bound to this clock */
	Schedq	hiq;
	Schedq	loq;
	int	nrdy;

	int	tlbfault;
	int	tlbpurge;

M pc/fns.h => pc/fns.h +0 -2
@@ 2,8 2,6 @@

void	aamloop(int);
void	addconf(char*, char*);
#define	affinity(x) m
#define	balance(x) m
void	bbinit(void);
void	bigcursor(void);
void	bootargs(ulong);

M port/cache.c => port/cache.c +18 -5
@@ 268,6 268,11 @@ cread(Chan *c, uchar *buf, int len, ulong offset)
			return total;
		}

		o = offset - e->start;
		l = len;
		if(l > e->len-o)
			l = e->len-o;

		k = kmap(p);
		if(waserror()) {
			kunmap(k);


@@ 276,15 281,11 @@ cread(Chan *c, uchar *buf, int len, ulong offset)
			nexterror();
		}

		o = offset - e->start;
		l = len;
		if(l > e->len-o)
			l = e->len-o;

		memmove(buf, (uchar*)VA(k) + o, l);

		poperror();
		kunmap(k);

		putpage(p);

		buf += l;


@@ 337,7 338,12 @@ cchain(uchar *buf, ulong offset, int len, Extent **tail)

		p->daddr = e->bid;
		k = kmap(p);
		if(waserror()) {		/* buf may be virtual */
			kunmap(k);
			nexterror();
		}
		memmove((void*)VA(k), buf, l);
		poperror();
		kunmap(k);

		cachepage(p, &fscache);


@@ 366,7 372,14 @@ cpgmove(Extent *e, uchar *buf, int boff, int len)
		return 0;

	k = kmap(p);
	if(waserror()) {		/* Since buf may be virtual */
		kunmap(k);
		nexterror();
	}

	memmove((uchar*)VA(k)+boff, buf, len);

	poperror();
	kunmap(k);
	putpage(p);


M port/devlance.c => port/devlance.c +8 -3
@@ 158,6 158,7 @@ lancereset(void)
	 */
	*l.rap = 0;
	*l.rdp = STOP;
	l.wedged = 1;
}

/*


@@ 260,6 261,12 @@ lancestart(int mode)
	wbflush();
	*l.rap = 0;
	*l.rdp = INEA|INIT|STRT; /**/

	for(i = 0; i < 1000; i++)
		if(l.wedged == 0)
			break;

	qunlock(&l.tlock);
}

void


@@ 294,10 301,8 @@ lanceintr(void)
		}
	}

	if(csr & IDON){
	if(csr & IDON)
		l.wedged = 0;
		qunlock(&l.tlock);
	}

	/*
	 *  the lance turns off if it gets strange output errors

M port/portdat.h => port/portdat.h +0 -2
@@ 577,8 577,6 @@ struct Proc
	int	(*notify)(void*, char*);

	Mach	*mp;		/* machine this process last ran on */
	ulong	affinity;	/* affinity counter for that mach */
	ulong	movetime;	/* ticks when proc was last reassigned */
	ulong	priority;

	void	*ureg;		/* User registers for notes */

M port/proc.c => port/proc.c +71 -28
@@ 21,8 21,14 @@ struct
	Waitq	*free;
}waitqalloc;


enum
{
	Nrq = 5,	/* number of run queues */
};

int	nrdy;
Schedq	runhiq;		/* for hi priority process, don't bother with affinity */
Schedq	runq[Nrq];

char *statename[] =
{			/* BUG: generate automatically */


@@ 102,7 108,13 @@ sched(void)
int
anyready(void)
{
	return m->hiq.head != 0 || m->loq.head != 0;
	Schedq *rq;

	for(rq = runq; rq < &runq[Nrq]; rq++)
		if(rq->head)
			return 1;

	return 0;
}

void


@@ 113,14 125,17 @@ ready(Proc *p)

	s = splhi();

	if(p->priority)
		rq = &runhiq;
	else if(p->state == Running)
		rq = &balance(p)->loq;
	else
		rq = &affinity(p)->hiq;
	if(p->priority != 0){
		if(p->state == Running){
			if(p->priority < Nrq-1)
				p->priority++;
		} else
			p->priority = 1;
	}
if(p->priority < 0 || p->priority >= Nrq) panic("ready");
	rq = &runq[p->priority];

	lock(&runhiq);
	lock(runq);
	p->rnext = 0;
	if(rq->tail)
		rq->tail->rnext = p;


@@ 130,7 145,7 @@ ready(Proc *p)
	rq->n++;
	nrdy++;
	p->state = Ready;
	unlock(&runhiq);
	unlock(runq);
	splx(s);
}



@@ 138,38 153,59 @@ Proc*
runproc(void)
{
	Schedq *rq;
	Proc *p;
	Proc *p, *l;

loop:

	/*
	 *  find highest priority queue with runnable process
	 */
	spllo();
	while(runhiq.head == 0 && m->hiq.head == 0 && m->loq.head == 0)
		;
	for(rq = runq; rq < &runq[Nrq]; rq++)
		if(rq->head)
			break;
	if(rq == &runq[Nrq])
		goto loop;
	splhi();

	lock(&runhiq);
	if(runhiq.head)
		rq = &runhiq;
	else if(m->hiq.head)
		rq = &m->hiq;
	else
		rq = &m->loq;
	lock(runq);

	/*
	 *  affinity: look for a process last run on this processor,
	 *	otherwise, take first in list.
	 */
	l = 0;
	for(p = rq->head; p; p = p->rnext){
		if(p->mp == m)
			break;
		l = p;
	}
	if(p == 0){
		l = 0;
		p = rq->head;
	}

	p = rq->head;
	/* p->mach==0 only when process state is saved */
	/*
	 *  p->mach==0 only when process state is saved
	 */
	if(p == 0 || p->mach){	
		unlock(&runhiq);
		unlock(&runq[0]);
		goto loop;
	}
	if(p->rnext == 0)
		rq->tail = 0;
	rq->head = p->rnext;
		rq->tail = l;
	if(l)
		l->rnext = p->rnext;
	else
		rq->head = p->rnext;
	rq->n--;
	nrdy--;
	if(p->state != Ready)
		print("runproc %s %d %s\n", p->text, p->pid, statename[p->state]);
	unlock(&runhiq);
	unlock(runq);

	p->state = Scheding;
	p->mp = m;
	return p;
}



@@ 179,13 215,13 @@ canpage(Proc *p)
	int ok = 0;

	splhi();
	lock(&runhiq);
	lock(&runq[0]);
	/* Only reliable way to see if we are Running */
	if(p->mach == 0) {
		p->newtlb = 1;
		ok = 1;
	}
	unlock(&runhiq);
	unlock(&runq[0]);
	spllo();

	return ok;


@@ 672,6 708,7 @@ procdump(void)
	char *s;
	Proc *p;
	ulong bss;
	Schedq *rq;

	for(i=0; i<conf.nproc; i++) {
		p = &procalloc.arena[i];


@@ 688,6 725,12 @@ 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++){
		print("rq%d:", rq-runq);
		for(p = rq->head; p; p = p->rnext)
			print(" %d", p->pid);
		print("\n");
	}
}

void

M port/sysproc.c => port/sysproc.c +4 -0
@@ 165,6 165,8 @@ sysrfork(ulong *arg)
	 *  (i.e. has bad properties) and has to be discarded.
	 */
	flushmmu();
	p->priority = up->priority;
	p->mp = up->mp;
	ready(p);
	return pid;
}


@@ 384,6 386,8 @@ sysexec(ulong *arg)
	 *  '/' processes are high priority (hack to make /ip more responsive)
	 */
	if(devchar[tc->type] == L'/')
		up->priority = 0;
	else
		up->priority = 1;
	close(tc);


M power/dat.h => power/dat.h +1 -2
@@ 115,8 115,7 @@ struct Mach
	int	intr;
	int	ledval;			/* value last written to LED */
	int	otlbfault;
	Schedq	hiq;
	Schedq	loq;
	int	nrdy;

	int	stack[1];
};

M power/fns.h => power/fns.h +0 -2
@@ 1,8 1,6 @@
#include "../port/portfns.h"

#define affinity(x) m
void	arginit(void);
#define	balance(x) m
void	clearmmucache(void);
void	clock(Ureg*);
void	clockinit(void);