~kris/9p

9hist

6df3aec7a369c6beae1e6399eb7cc41c2db8a014 — David du Colombier 33 years ago e49b6b0
Plan 9 from Bell Labs 1993-09-10
6 files changed, 51 insertions(+), 28 deletions(-)

M carrera/io.h
M carrera/screen.c
M port/devcons.c
M port/page.c
M port/portdat.h
M port/swap.c
M carrera/io.h => carrera/io.h +3 -1
@@ 70,5 70,7 @@ struct Tte
#define UNCACHED(type, v)	(type*)((ulong)(v)|0xA0000000)

#define EISA(v)			(Eisamvirt+(v))
#define EISAOUTB(port, v)	*(uchar*)((EisaControl+(port))^7) = v
#define EISAINB(port)		(*(uchar*)((EisaControl+(port))^7))
#define EISAINW(port)		(*(ushort*)((EisaControl+(port))^7))
#define EISAOUTB(port, v)	EISAINB(port) = v
#define EISAOUTW(port, v)	EISAINW(port) = v

M carrera/screen.c => carrera/screen.c +16 -3
@@ 190,11 190,24 @@ screeninit(void)
	int i, j;
	uchar *scr;

	EISAOUTB(0x3c3, 1);
	delay(1);
	EISAOUTB(0x46e8, 0x8);
EISAOUTB(0x3C3, 1);
EISAOUTB(0x46e8, 8);
EISAOUTB(0x3bf, 1);
i = EISAINB(0x3b8);
print("=%2.2ux\n", i);
EISAOUTB(0x3bf, 3);
i = EISAINB(0x3b8);
print("=%2.2ux\n", i);
EISAOUTB(0x3bf, 1);
i = EISAINB(0x3d8);
print("=%2.2ux\n", i);
EISAOUTB(0x3bf, 3);
i = EISAINB(0x3d8);
print("=%2.2ux\n", i);
EISAOUTB(0x3d8, 0xa0);

	setmode(&dfltmode);
	setmode(&dfltmode);
	getvmode(&x);
	writeregisters(&x);
return;

M port/devcons.c => port/devcons.c +6 -3
@@ 611,9 611,12 @@ consread(Chan *c, void *buf, long n, ulong offset)
		return n;

	case Qswap:
		sprint(tmp, "%d/%d memory %d/%d swap\n",
				palloc.user-palloc.freecount, palloc.user, 
				conf.nswap-swapalloc.free, conf.nswap);
		k = 0;
		for(i = 0; i < NCOLOR; i++)
			k += palloc.freecol[i];

		sprint(tmp, "%d/%d memory %d/%d swap\n", palloc.user-k,
			palloc.user, conf.nswap-swapalloc.free, conf.nswap);

		return readstr(offset, buf, n, tmp);


M port/page.c => port/page.c +14 -11
@@ 87,17 87,17 @@ retry:
			*s = 0;
			dontalloc = 1;
		}
		qlock(&palloc.pwait);	 /* Hold memory requesters here */
		qlock(&palloc.pwait[color]); /* Hold memory requesters here */

		while(waserror())	/* Ignore interrupts */
			;

		kickpager();
		tsleep(&palloc.r, ispages, 0, 1000);
		tsleep(&palloc.r[color], ispages, (void*)color, 1000);

		poperror();

		qunlock(&palloc.pwait);
		qunlock(&palloc.pwait[color]);

		/*
		 * If called from fault and we lost the segment from


@@ 130,7 130,6 @@ retry:
		palloc.tail = p->prev;


	palloc.freecount--;
	palloc.freecol[color]--;
	unlock(&palloc);



@@ 160,13 159,17 @@ retry:
int
ispages(void *p)
{
	USED(p);
	return palloc.freecount >= swapalloc.highwater;
	int color;

	color = (int)p;
	return palloc.freecol[color] >= swapalloc.highwater/NCOLOR;
}

void
putpage(Page *p)
{
	Rendez *r;

	if(onswap(p)) {
		putswap(p);
		return;


@@ 204,10 207,10 @@ putpage(Page *p)
		p->prev = 0;
	}

	palloc.freecount++;	/* Release people waiting for memory */
	palloc.freecol[p->color]++;
	if(palloc.r.p != 0)
		wakeup(&palloc.r);
	r = &palloc.r[p->color];
	if(r->p != 0)
		wakeup(r);

	unlock(&palloc);
	unlock(p);


@@ 227,7 230,7 @@ duppage(Page *p)				/* Always call with p locked */

	lock(&palloc);
	/* No freelist cache when memory is very low */
	if(palloc.freecount < swapalloc.highwater) {
	if(palloc.freecol[p->color] < swapalloc.highwater/NCOLOR) {
		unlock(&palloc);
		uncachepage(p);	
		return;


@@ 385,7 388,7 @@ lookpage(Image *i, ulong daddr)
					f->next->prev = f->prev;
				else
					palloc.tail = f->prev;
				palloc.freecount--;

				palloc.freecol[f->color]--;
			}
			unlock(&palloc);

M port/portdat.h => port/portdat.h +2 -3
@@ 452,13 452,12 @@ struct Palloc
	ulong	np0, np1;		/* number of pages in bank 0/1 */
	Page	*head;			/* most recently used */
	Page	*tail;			/* least recently used */
	ulong	freecount;
	ulong	freecol[NCOLOR];	/* how many pages on free list now */
	ulong	user;			/* how many user pages */
	Page	*hash[PGHSIZE];
	Lock	hashlock;
	Rendez	r;			/* Sleep for free mem */
	QLock	pwait;			/* Queue of procs waiting for memory */
	Rendez	r[NCOLOR];		/* Sleep for free mem */
	QLock	pwait[NCOLOR];		/* Queue of procs waiting for memory */
	int	wanted;			/* Do the wakeup at free */
	ulong	cmembase;		/* Key memory */
	ulong	cmemtop;

M port/swap.c => port/swap.c +10 -7
@@ 109,7 109,7 @@ loop:
	up->psstate = "Idle";
	sleep(&swapalloc.r, needpages, 0);

	for(;;) {
	while(needpages(junk)) {
		p++;
		if(p >= ep)
			p = proctab(0);


@@ 142,17 142,16 @@ loop:
					}
				}
			}
			continue;
		}

		if(palloc.freecount < swapalloc.highwater) {
		else {
			if(!cpuserver)
				freebroken();	/* can use the memory */

			/* Emulate the old system if no swap channel */
			print("no physical memory\n");
			tsleep(&swapalloc.r, return0, 0, 1000);
			wakeup(&palloc.r);
			for(i = 0; i < NCOLOR; i++)
				wakeup(&palloc.r[i]);
		}
	}
	goto loop;


@@ 211,7 210,6 @@ out:
	poperror();
	qunlock(&s->lk);
	putseg(s);
	wakeup(&palloc.r);
}

int


@@ 322,8 320,13 @@ executeio(void)
int
needpages(void *p)
{
	int i;

	USED(p);
	return palloc.freecount < swapalloc.headroom;
	for(i = 0; i < NCOLOR; i++)
		if(palloc.freecol[i] < swapalloc.headroom/NCOLOR)
			return 1;
	return 0;
}

void