~kris/9p

9hist

a26351d50f0e50761355ad393cfb1acd5171e714 — David du Colombier 33 years ago 995bfb1
Plan 9 from Bell Labs 1993-08-10
2 files changed, 45 insertions(+), 57 deletions(-)

M port/page.c
M port/segment.c
M port/page.c => port/page.c +37 -50
@@ 59,13 59,14 @@ newpage(int clear, Segment **s, ulong va)
{
	Page *p;
	KMap *k;
	int hw, dontalloc;
	int hw, dontalloc, fc;

retry:
	lock(&palloc);

	hw = swapalloc.highwater;
	while((palloc.freecount < hw && up->kp == 0) || palloc.freecount == 0) {
	fc = palloc.freecount;
	while((fc < hw && up->kp == 0) || fc == 0) {
		palloc.wanted++;
		unlock(&palloc);
		dontalloc = 0;


@@ 74,9 75,9 @@ retry:
			*s = 0;
			dontalloc = 1;
		}
		qlock(&palloc.pwait);			/* Hold memory requesters here */
		qlock(&palloc.pwait);	/* Hold memory requesters here */

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

		kickpager();


@@ 87,9 88,10 @@ retry:
		qunlock(&palloc.pwait);

		/*
		 * If called from fault and we lost the segment from underneath
		 * don't waste time allocating and freeing a page. Fault will call
		 * newpage again when it has reacquired the segment locks
		 * If called from fault and we lost the segment from
		 * underneath don't waste time allocating and freeing 
		 * a page. Fault will call newpage again when it has 
		 * reacquired the segment locks
		 */
		if(dontalloc)
			return 0;


@@ 119,7 121,7 @@ retry:
	memset(p->cachectl, PG_DATINVALID, sizeof(p->cachectl));
	unlock(p);

	if(clear){
	if(clear) {
		k = kmap(p);
		memset((void*)VA(k), 0, BY2PG);
		kunmap(k);


@@ 144,55 146,40 @@ putpage(Page *p)
	}

	lock(p);
	if(--p->ref == 0) {
		lock(&palloc);
		if(p->image && p->image != &swapimage) {
			if(palloc.tail) {
				p->prev = palloc.tail;
				palloc.tail->next = p;
			}
			else {
				palloc.head = p;
				p->prev = 0;
			}
			palloc.tail = p;
			p->next = 0;
	if(--p->ref > 0) {
		unlock(p);
		return;
	}
	vcacheinval(p);
	lock(&palloc);
	if(p->image && p->image != &swapimage) {
		if(palloc.tail) {
			p->prev = palloc.tail;
			palloc.tail->next = p;
		}
		else {
			if(palloc.head) {
				p->next = palloc.head;
				palloc.head->prev = p;
			}
			else {
				palloc.tail = p;
				p->next = 0;
			}
			palloc.head = p;
			p->prev = 0;
		}

		palloc.freecount++;	/* Release people waiting for memory */
		unlock(&palloc);
		palloc.tail = p;
		p->next = 0;
	}
	unlock(p);
}

void
simpleputpage(Page *pg)			/* Always call with palloc locked */
{
	if(pg->ref != 1)
		panic("simpleputpage");
	pg->ref = 0;
	palloc.freecount++;
	if(palloc.head == 0) {
		palloc.head = palloc.tail = pg;
		pg->prev = pg->next = 0;
		return;
	else {
		if(palloc.head) {
			p->next = palloc.head;
			palloc.head->prev = p;
		}
		else {
			palloc.tail = p;
			p->next = 0;
		}
		palloc.head = p;
		p->prev = 0;
	}
	pg->next = palloc.head;
	palloc.head->prev = pg;
	pg->prev = 0;
	palloc.head = pg;

	palloc.freecount++;	/* Release people waiting for memory */
	unlock(&palloc);
	unlock(p);
}

void

M port/segment.c => port/segment.c +8 -7
@@ 94,16 94,17 @@ putseg(Segment *s)
void
relocateseg(Segment *s, ulong offset)
{
	Pte **p, **endpte;
	Page **pg, **endpages;
	Page **pg, *x;
	Pte *pte, **p, **endpte;

	endpte = &s->map[SEGMAPSIZE];
	for(p = s->map; p < endpte; p++) {
		if(*p) {
			endpages = &((*p)->pages[PTEPERTAB]);
			for(pg = (*p)->pages; pg < endpages; pg++)
				if(*pg)
					(*pg)->va += offset;
		if(*p == 0)
			continue;
		pte = *p;
		for(pg = pte->first; pg <= pte->last; pg++) {
			if(x = *pg)
				x->va += offset;
		}
	}
}