plan 9 kernel history: overview | file list | diff list

1992/0321/port/page.c (diff list | history)

1990/0227/sys/src/9/port/page.c:77,931990/0303/sys/src/9/port/page.c:77,94 (short | long)
1990/0227    
{ 
	int nf, nb; 
	Page *p; 
1990/0303    
	static int here; 
1990/0227    
 
static int here; 
do;while(here); 
here=1; 
                 
1990/0303    
	do;while(here); 
	here=1; 
1990/0227    
	p = palloc.head; 
	nf=nb=0; 
	while(p){ 
print("%lux %lux %d\n", p->pa, p->va, p->ref); 
if(p->o) print("\t%d %lux %c\n", p->o->nproc, p->o->qid, devchar[p->o->type]); 
delay(100); 
1990/0303    
		print("%lux %lux %d\n", p->pa, p->va, p->ref); 
		if(p->o){ 
			print("\t%d %lux %c\n", p->o->nproc, p->o->qid, devchar[p->o->type]); 
			delay(100);	/* let it drain; there's a lot here */ 
		} 
1990/0227    
		nf++; 
		p = p->next; 
	} 
1990/0227/sys/src/9/port/page.c:98,1041990/0303/sys/src/9/port/page.c:99,105
1990/0227    
	} 
	print("%s: nf: %d nb: %d\n", s, nf, nb); 
	delay(1000); 
here=0; 
1990/0303    
	here=0; 
1990/0227    
} 
 
void 
1990/0227/sys/src/9/port/page.c:187,1931990/0303/sys/src/9/port/page.c:188,193
1990/0227    
		} 
#endif 
	} 
	audit("newpage"); 
	print("no physical memory\n"); 
	unlock(&palloc); 
	if(u == 0) 
1990/0227/sys/src/9/port/page.c:257,2631990/0303/sys/src/9/port/page.c:257,263
1990/0227    
			lock(o); 
			if(o->npage && o->qid==c->qid) 
			if(o->va==va && o->npte==npte && o->flag==flag) 
			if(o->type==c->type && o->dev==c->dev){ 
1990/0303    
			if(o->mchan==c->mchan && o->mqid==c->mqid && o->type==c->type){ 
1990/0227    
				if(o->chan == 0){ 
					o->chan = c; 
					incref(c); 
1990/0227/sys/src/9/port/page.c:289,3011990/0303/sys/src/9/port/page.c:289,303
1990/0227    
		o->chan = c; 
		if(c){ 
			o->type = c->type; 
			o->dev = c->dev; 
			o->qid = c->qid; 
1990/0303    
			o->mchan = c->mchan; 
			o->mqid = c->mqid; 
1990/0227    
			incref(c); 
		}else{ 
			o->type = -1; 
			o->dev = -1; 
			o->qid = -1; 
1990/0303    
			o->mqid = -1; 
			o->mchan = 0; 
1990/0227    
		} 
		growpte(o, npte); 
		unlock(&origalloc); 
1990/0303/sys/src/9/port/page.c:287,2921990/0312/sys/src/9/port/page.c:287,293 (short | long)
1990/0227    
		o->nproc = 1; 
		o->npage = 0; 
		o->chan = c; 
1990/0312    
o->nmod = 0; 
1990/0227    
		if(c){ 
			o->type = c->type; 
			o->qid = c->qid; 
1990/0303/sys/src/9/port/page.c:350,3551990/0312/sys/src/9/port/page.c:351,358
1990/0227    
	} 
	unlock(&modalloc); 
	print("no mods\n"); 
1990/0312    
DEBUG(); 
panic("mods"); 
1990/0227    
	if(u == 0) 
		panic("newmod"); 
	u->p->state = Wakeme; 
1990/0303/sys/src/9/port/page.c:376,3811990/0312/sys/src/9/port/page.c:379,385
1990/0227    
if(pte->page==0) panic("forkmod zero page"); 
if(pte->proc != u->p) panic("forkmod wrong page"); 
		npte = newmod(); 
1990/0312    
o->nmod++; 
1990/0227    
		npte->proc = p; 
		npte->page = pte->page; 
		pte->page->ref++; 
1990/0303/sys/src/9/port/page.c:435,4401990/0312/sys/src/9/port/page.c:439,445
1990/0227    
				} 
				pg->ref--; 
				o->npage--; 
1990/0312    
o->nmod--; 
1990/0227    
				old = (PTEA*)pte; 
				pte = pte->nextva; 
				lock(&modalloc); 
1990/0312/sys/src/9/port/page.c:189,1941990/0409/sys/src/9/port/page.c:189,195 (short | long)
1990/0227    
#endif 
	} 
	print("no physical memory\n"); 
1990/0409    
	pprint("no physical memory\n"); 
1990/0227    
	unlock(&palloc); 
	if(u == 0) 
		panic("newpage"); 
1990/0409/sys/src/9/port/page.c:10,161990/0617/sys/src/9/port/page.c:10,16 (short | long)
1990/0227    
	Lock; 
	ulong	addr; 
	int	active; 
	Page	*page;		/* base of Page structures, indexed by phys addr */ 
1990/0617    
	Page	*page;		/* base of Page structures, indexed by phys page number */ 
1990/0227    
	ulong	minppn;		/* index of first usable page */ 
	Page	*head;		/* most recently used */ 
	Page	*tail;		/* least recently used */ 
1990/0409/sys/src/9/port/page.c:161,1661990/0617/sys/src/9/port/page.c:161,167
1990/0227    
{ 
	Page *p; 
	Orig *o1; 
1990/0617    
	KMap *k; 
1990/0227    
 
	if(palloc.active == 0) 
		print("newpage inactive\n"); 
1990/0409/sys/src/9/port/page.c:206,2131990/0617/sys/src/9/port/page.c:207,217
1990/0227    
	p->ref = 1; 
	usepage(p, 0); 
	unlock(&palloc); 
	if(!noclear) 
		memset((void*)(p->pa|KZERO), 0, BY2PG); 
1990/0617    
	if(!noclear){ 
		k = kmap(p); 
		memset((void*)VA(k), 0, BY2PG); 
		kunmap(k); 
	} 
1990/0227    
	p->o = o; 
	p->va = va; 
 
1990/0617/sys/src/9/port/page.c:493,4981990/0720/sys/src/9/port/page.c:493,499 (short | long)
1990/0227    
 
	if(max < min) 
		return 0; 
1990/0720    
if(max > 20*1024*1024) pprint("segaddr %lux\n", max); 
1990/0227    
	if(min != s->minva)	/* can't grow down yet (stacks: fault.c) */ 
		return 0; 
	max = (max+(BY2PG-1)) & ~(BY2PG-1); 
1990/0720/sys/src/9/port/page.c:560,5691990/0728/sys/src/9/port/page.c:560,574 (short | long)
1990/0227    
	lock(&ptealloc); 
	lock(o); 
	if(o->pte){ 
		if(o->npte == n) 
			panic("growpte pointless"); 
1990/0728    
		if(o->npte == n){ 
if(u && u->p) print("%s: ", u->p->text); 
			print("growpte pointless\n"); 
			goto Return; 
		} 
1990/0227    
		p = (PTEA*)(o->pte - 1); 
		if(o->npte > n){ 
1990/0728    
			print("growpte shrink"); 
			goto Return; 
1990/0227    
			nfree = o->npte - n; 
			p->n -= nfree; 
			o->npte -= nfree; 
1990/0720/sys/src/9/port/page.c:589,5971990/0728/sys/src/9/port/page.c:594,600
1990/0227    
			p->n = n; 
			o->npte = n-1; 
		} 
		unlock(o); 
		unlock(&ptealloc); 
		return; 
1990/0728    
		goto Return; 
1990/0227    
	} 
	n++; 
	compactpte(o, n); 
1990/0720/sys/src/9/port/page.c:602,6071990/0728/sys/src/9/port/page.c:605,611
1990/0227    
	p->o = o; 
	o->pte = p+1; 
	o->npte = n-1; 
1990/0728    
    Return: 
1990/0227    
	unlock(o); 
	unlock(&ptealloc); 
} 
1990/0728/sys/src/9/port/page.c:251,2561990/0801/sys/src/9/port/page.c:251,290 (short | long)
1990/0227    
		unlock(&palloc); 
} 
 
1990/0801    
/* 
 * Move page to tail of list 
 */ 
void 
unusepage(Page *p, int dolock) 
{ 
return; 
	if(dolock) 
		lock(&palloc); 
	/* 
	 * Unlink 
	 */ 
	if(p->prev) 
		p->prev->next = p->next; 
	else 
		palloc.head = p->next; 
	if(p->next) 
		p->next->prev = p->prev; 
	else 
		palloc.tail = p->prev; 
	/* 
	 * Link 
	 */ 
	p->prev = palloc.tail; 
	p->next = 0; 
	if(p->prev) 
		p->prev->next = p; 
	else 
		palloc.head = p; 
	palloc.tail = p; 
	if(dolock) 
		unlock(&palloc); 
} 
 
1990/0227    
Orig* 
lookorig(ulong va, ulong npte, int flag, Chan *c) 
{ 
1990/0728/sys/src/9/port/page.c:493,4991990/0801/sys/src/9/port/page.c:527,533
1990/0227    
 
	if(max < min) 
		return 0; 
1990/0720    
if(max > 20*1024*1024) pprint("segaddr %lux\n", max); 
1990/0801    
if(max > 20*1024*1024) {pprint("segaddr %lux\n", max);print("segaddr %lux\n", max);} 
1990/0227    
	if(min != s->minva)	/* can't grow down yet (stacks: fault.c) */ 
		return 0; 
	max = (max+(BY2PG-1)) & ~(BY2PG-1); 
1990/0728/sys/src/9/port/page.c:531,5361990/0801/sys/src/9/port/page.c:565,571
1990/0227    
	for(i=0; i<o->npte; i++,pte++) 
		if(pg = pte->page){	/* assign = */ 
			if(pg->ref == 1){ 
1990/0801    
				unusepage(pg, 1); 
1990/0227    
				pte->page = 0; 
				pg->o = 0; 
			} 
1990/0801/sys/src/9/port/page.c:4,91990/0802/sys/src/9/port/page.c:4,10 (short | long)
1990/0227    
#include	"dat.h" 
#include	"fns.h" 
#include	"ureg.h" 
1990/0802    
#include	"errno.h" 
1990/0227    
 
struct 
{ 
1990/0801/sys/src/9/port/page.c:257,2631990/0802/sys/src/9/port/page.c:258,263
1990/0801    
void 
unusepage(Page *p, int dolock) 
{ 
return; 
	if(dolock) 
		lock(&palloc); 
	/* 
1990/0801/sys/src/9/port/page.c:339,3451990/0802/sys/src/9/port/page.c:339,354
1990/0303    
			o->mqid = -1; 
			o->mchan = 0; 
1990/0227    
		} 
1990/0802    
		lock(o); 
		if(u && u->p && waserror()){ 
			unlock(o); 
			unlock(&origalloc); 
			nexterror(); 
		} 
1990/0227    
		growpte(o, npte); 
1990/0802    
		if(u && u->p) 
			poperror(); 
		unlock(o); 
1990/0227    
		unlock(&origalloc); 
		return o; 
	} 
1990/0801/sys/src/9/port/page.c:527,5331990/0802/sys/src/9/port/page.c:536,541
1990/0227    
 
	if(max < min) 
		return 0; 
1990/0801    
if(max > 20*1024*1024) {pprint("segaddr %lux\n", max);print("segaddr %lux\n", max);} 
1990/0227    
	if(min != s->minva)	/* can't grow down yet (stacks: fault.c) */ 
		return 0; 
	max = (max+(BY2PG-1)) & ~(BY2PG-1); 
1990/0801/sys/src/9/port/page.c:539,5461990/0802/sys/src/9/port/page.c:547,561
1990/0227    
		 * Grow 
		 */ 
		/* BUG: check spill onto other segments */ 
1990/0802    
		lock(o); 
		if(waserror()){ 
			unlock(o); 
			nexterror(); 
		} 
1990/0227    
		if(o->va+BY2PG*o->npte < max) 
			growpte(o, (max-o->va)>>PGSHIFT); 
1990/0802    
		unlock(o); 
		poperror(); 
1990/0227    
		s->maxva = max; 
		return 1; 
	} 
1990/0801/sys/src/9/port/page.c:593,5991990/0802/sys/src/9/port/page.c:608,613
1990/0227    
	ulong nfree; 
 
	lock(&ptealloc); 
	lock(o); 
	if(o->pte){ 
1990/0728    
		if(o->npte == n){ 
if(u && u->p) print("%s: ", u->p->text); 
1990/0801/sys/src/9/port/page.c:613,6231990/0802/sys/src/9/port/page.c:627,639
1990/0227    
		}else{ 
			n++; 
			if(p+p->n == ptealloc.free){ 
				compactpte(o, n - p->n); 
1990/0802    
				if(!compactpte(o, n - p->n)) 
					goto Trouble; 
1990/0227    
				p = (PTEA*)(o->pte - 1); 
				ptealloc.free += n - p->n; 
			}else{ 
				compactpte(o, n); 
1990/0802    
				if(!compactpte(o, n)) 
					goto Trouble; 
1990/0227    
				p = ptealloc.free; 
				ptealloc.free += n; 
				memcpy(p+1, o->pte, o->npte*sizeof(PTE)); 
1990/0801/sys/src/9/port/page.c:632,6381990/0802/sys/src/9/port/page.c:648,655
1990/0728    
		goto Return; 
1990/0227    
	} 
	n++; 
	compactpte(o, n); 
1990/0802    
	if(!compactpte(o, n)) 
		goto Trouble; 
1990/0227    
	p = ptealloc.free; 
	ptealloc.free += n; 
	memset(p, 0, n*sizeof(PTE)); 
1990/0801/sys/src/9/port/page.c:641,6511990/0802/sys/src/9/port/page.c:658,674
1990/0227    
	o->pte = p+1; 
	o->npte = n-1; 
1990/0728    
    Return: 
1990/0227    
	unlock(o); 
	unlock(&ptealloc); 
1990/0802    
	return; 
 
    Trouble: 
	unlock(&ptealloc); 
	if(u && u->p) 
		error(0, Enovmem); 
	panic("growpte fails %d %lux %d\n", n, o->va, o->npte); 
1990/0227    
} 
 
void 
1990/0802    
int 
1990/0227    
compactpte(Orig *o, ulong n) 
{ 
	PTEA *p1, *p2; 
1990/0801/sys/src/9/port/page.c:652,6581990/0802/sys/src/9/port/page.c:675,681
1990/0227    
	Orig *p2o; 
 
	if(ptealloc.end-ptealloc.free >= n) 
		return; 
1990/0802    
		return 1; 
1990/0227    
	p1 = ptealloc.arena;	/* dest */ 
	p2 = ptealloc.arena;	/* source */ 
	while(p2 < ptealloc.free){ 
1990/0801/sys/src/9/port/page.c:681,6881990/0802/sys/src/9/port/page.c:704,714
1990/0227    
	} 
	ptealloc.free = p1; 
	if(ptealloc.end-ptealloc.free >= n) 
		return; 
1990/0802    
		return 1; 
1990/0227    
	unlock(o); 
	unlock(&ptealloc); 
	panic("compactpte %d %lux %d", n, o->va, o->npte); 
1990/0802    
	if(u && u->p) 
		print("%s: %s: ", u->p->text, u->p->pgrp->user); 
	print("compactpte fails addr %lux\n", o->va+n*BY2PG); 
	return 0; 
1990/0227    
} 
1990/0802/sys/src/9/port/page.c:339,3471990/0814/sys/src/9/port/page.c:339,345 (short | long)
1990/0303    
			o->mqid = -1; 
			o->mchan = 0; 
1990/0227    
		} 
1990/0802    
		lock(o); 
		if(u && u->p && waserror()){ 
			unlock(o); 
			unlock(&origalloc); 
			nexterror(); 
		} 
1990/0802/sys/src/9/port/page.c:348,3541990/0814/sys/src/9/port/page.c:346,351
1990/0227    
		growpte(o, npte); 
1990/0802    
		if(u && u->p) 
			poperror(); 
		unlock(o); 
1990/0227    
		unlock(&origalloc); 
		return o; 
	} 
1990/0802/sys/src/9/port/page.c:547,5611990/0814/sys/src/9/port/page.c:544,551
1990/0227    
		 * Grow 
		 */ 
		/* BUG: check spill onto other segments */ 
1990/0802    
		lock(o); 
		if(waserror()){ 
			unlock(o); 
			nexterror(); 
		} 
1990/0227    
		if(o->va+BY2PG*o->npte < max) 
			growpte(o, (max-o->va)>>PGSHIFT); 
1990/0802    
		unlock(o); 
		poperror(); 
1990/0227    
		s->maxva = max; 
		return 1; 
	} 
1990/0802/sys/src/9/port/page.c:601,6061990/0814/sys/src/9/port/page.c:591,600
1990/0227    
	p->o = 0; 
} 
 
1990/0814    
/* 
 * o is locked.  this will always do a grow; if n<=o->npte someone 
 * else got here first and we can just return. 
 */ 
1990/0227    
void 
growpte(Orig *o, ulong n) 
{ 
1990/0802/sys/src/9/port/page.c:608,6501990/0814/sys/src/9/port/page.c:602,631
1990/0227    
	ulong nfree; 
 
	lock(&ptealloc); 
1990/0814    
	lock(o); 
1990/0227    
	if(o->pte){ 
1990/0728    
		if(o->npte == n){ 
if(u && u->p) print("%s: ", u->p->text); 
			print("growpte pointless\n"); 
1990/0814    
		if(o->npte >= n) 
1990/0728    
			goto Return; 
		} 
1990/0227    
		p = (PTEA*)(o->pte - 1); 
		if(o->npte > n){ 
1990/0728    
			print("growpte shrink"); 
			goto Return; 
1990/0227    
			nfree = o->npte - n; 
			p->n -= nfree; 
			o->npte -= nfree; 
			p += p->n; 
			p->o = 0; 
			p->n = nfree; 
1990/0814    
		n++; 
		if(p+p->n == ptealloc.free){ 
			if(!compactpte(o, n - p->n)) 
				goto Trouble; 
			p = (PTEA*)(o->pte - 1); 
			ptealloc.free += n - p->n; 
1990/0227    
		}else{ 
			n++; 
			if(p+p->n == ptealloc.free){ 
1990/0802    
				if(!compactpte(o, n - p->n)) 
					goto Trouble; 
1990/0227    
				p = (PTEA*)(o->pte - 1); 
				ptealloc.free += n - p->n; 
			}else{ 
1990/0802    
				if(!compactpte(o, n)) 
					goto Trouble; 
1990/0227    
				p = ptealloc.free; 
				ptealloc.free += n; 
				memcpy(p+1, o->pte, o->npte*sizeof(PTE)); 
				p->o = o; 
				((PTEA*)(o->pte-1))->o = 0; 
				o->pte = p+1; 
			} 
			memset(p+1+o->npte, 0, (n-(1+o->npte))*sizeof(PTE)); 
			p->n = n; 
			o->npte = n-1; 
1990/0814    
			if(!compactpte(o, n)) 
				goto Trouble; 
			p = ptealloc.free; 
			ptealloc.free += n; 
			memcpy(p+1, o->pte, o->npte*sizeof(PTE)); 
			p->o = o; 
			((PTEA*)(o->pte-1))->o = 0; 
			o->pte = p+1; 
1990/0227    
		} 
1990/0814    
		memset(p+1+o->npte, 0, (n-(1+o->npte))*sizeof(PTE)); 
		p->n = n; 
		o->npte = n-1; 
1990/0728    
		goto Return; 
1990/0227    
	} 
	n++; 
1990/0802/sys/src/9/port/page.c:659,6681990/0814/sys/src/9/port/page.c:640,651
1990/0227    
	o->npte = n-1; 
1990/0728    
    Return: 
1990/0227    
	unlock(&ptealloc); 
1990/0814    
	unlock(o); 
1990/0802    
	return; 
 
    Trouble: 
	unlock(&ptealloc); 
1990/0814    
	unlock(o); 
1990/0802    
	if(u && u->p) 
		error(0, Enovmem); 
	panic("growpte fails %d %lux %d\n", n, o->va, o->npte); 
1990/0814/sys/src/9/port/page.c:382,3881990/1013/sys/src/9/port/page.c:382,388 (short | long)
1990/0227    
} 
 
PTE* 
newmod(void) 
1990/1013    
newmod(Orig *o) 
1990/0227    
{ 
	PTEA *pte; 
 
1990/0814/sys/src/9/port/page.c:397,4031990/1013/sys/src/9/port/page.c:397,403
1990/0227    
	unlock(&modalloc); 
	print("no mods\n"); 
1990/0312    
DEBUG(); 
panic("mods"); 
1990/1013    
panic("mods %lux %d %d", o->va, o->npte, o->nmod); 
1990/0227    
	if(u == 0) 
		panic("newmod"); 
	u->p->state = Wakeme; 
1990/0814/sys/src/9/port/page.c:423,4291990/1013/sys/src/9/port/page.c:423,429
1990/0227    
	while(pte){ 
if(pte->page==0) panic("forkmod zero page"); 
if(pte->proc != u->p) panic("forkmod wrong page"); 
		npte = newmod(); 
1990/1013    
		npte = newmod(o); 
1990/0312    
o->nmod++; 
1990/0227    
		npte->proc = p; 
		npte->page = pte->page; 
1990/1013/sys/src/9/port/page.c:463,4681990/1018/sys/src/9/port/page.c:463,469 (short | long)
1990/0227    
		if(i == save) 
			continue; 
		o = s->o; 
1990/1018    
		s->o = 0;	/* seg() won't match it (e.g. in procread()) */ 
1990/0227    
		if(o == 0) 
			continue; 
		lock(o); 
1990/1018/sys/src/9/port/page.c:190,2001990/1101/sys/src/9/port/page.c:190,202 (short | long)
1990/0227    
		} 
#endif 
	} 
	print("no physical memory\n"); 
1990/0409    
	pprint("no physical memory\n"); 
1990/0227    
	unlock(&palloc); 
1990/1101    
	if(freebroken()) 
		goto loop; 
1990/0227    
	if(u == 0) 
		panic("newpage"); 
1990/1101    
	print("no physical memory\n"); 
	pprint("no physical memory\n"); 
1990/0227    
	u->p->state = Wakeme; 
	alarm(1000, wakeme, u->p); 
	sched(); 
1990/1018/sys/src/9/port/page.c:316,3211990/1101/sys/src/9/port/page.c:318,324
1990/0227    
	Orig *o; 
	int i, freed; 
 
1990/1101    
lockloop: 
1990/0227    
	lock(&origalloc); 
loop: 
	if(o = origalloc.free){		/* assign = */ 
1990/1018/sys/src/9/port/page.c:370,3771990/1101/sys/src/9/port/page.c:373,382
1990/0227    
	} 
	if(freed) 
		goto loop; 
	print("no origs freed\n"); 
	unlock(&origalloc); 
1990/1101    
	if(freebroken()) 
		goto lockloop; 
	print("no origs freed\n"); 
1990/0227    
	if(u == 0) 
		panic("neworig"); 
	u->p->state = Wakeme; 
1990/1101/sys/src/9/port/page.c:559,5651990/1115/sys/src/9/port/page.c:559,565 (short | long)
1990/0227    
	 * Shrink 
	 */ 
	print("segaddr shrink"); 
	for(;;); 
1990/1115    
	pexit("Suicide", 0); 
1990/0227    
} 
 
/* 
1990/1115/sys/src/9/port/page.c:294,3041990/11211/sys/src/9/port/page.c:294,304 (short | long)
1990/0227    
	ulong i; 
 
	for(o=origalloc.arena,i=0; i<conf.norig; i++,o++) 
		if(o->npage && o->qid==c->qid && o->va==va){ 
1990/11211    
		if(o->npage && o->qid.path==c->qid.path && o->va==va){ 
1990/0227    
			lock(o); 
			if(o->npage && o->qid==c->qid) 
1990/11211    
			if(o->npage && eqqid(o->qid, c->qid)) 
1990/0227    
			if(o->va==va && o->npte==npte && o->flag==flag) 
1990/0303    
			if(o->mchan==c->mchan && o->mqid==c->mqid && o->type==c->type){ 
1990/11211    
			if(o->mchan==c->mchan && o->type==c->type && eqqid(o->mqid, c->mqid)){ 
1990/0227    
				if(o->chan == 0){ 
					o->chan = c; 
					incref(c); 
1990/1115/sys/src/9/port/page.c:329,3351990/11211/sys/src/9/port/page.c:329,334
1990/0227    
		o->nproc = 1; 
		o->npage = 0; 
		o->chan = c; 
1990/0312    
o->nmod = 0; 
1990/0227    
		if(c){ 
			o->type = c->type; 
			o->qid = c->qid; 
1990/1115/sys/src/9/port/page.c:338,3451990/11211/sys/src/9/port/page.c:337,344
1990/0227    
			incref(c); 
		}else{ 
			o->type = -1; 
			o->qid = -1; 
1990/0303    
			o->mqid = -1; 
1990/11211    
			o->qid = (Qid){~0, ~0}; 
			o->mqid = (Qid){~0, ~0}; 
1990/0303    
			o->mchan = 0; 
1990/0227    
		} 
1990/0802    
		if(u && u->p && waserror()){ 
1990/1115/sys/src/9/port/page.c:401,4081990/11211/sys/src/9/port/page.c:400,405
1990/0227    
	} 
	unlock(&modalloc); 
	print("no mods\n"); 
1990/0312    
DEBUG(); 
1990/1013    
panic("mods %lux %d %d", o->va, o->npte, o->nmod); 
1990/0227    
	if(u == 0) 
		panic("newmod"); 
	u->p->state = Wakeme; 
1990/1115/sys/src/9/port/page.c:429,4351990/11211/sys/src/9/port/page.c:426,431
1990/0227    
if(pte->page==0) panic("forkmod zero page"); 
if(pte->proc != u->p) panic("forkmod wrong page"); 
1990/1013    
		npte = newmod(o); 
1990/0312    
o->nmod++; 
1990/0227    
		npte->proc = p; 
		npte->page = pte->page; 
		pte->page->ref++; 
1990/1115/sys/src/9/port/page.c:490,4961990/11211/sys/src/9/port/page.c:486,491
1990/0227    
				} 
				pg->ref--; 
				o->npage--; 
1990/0312    
o->nmod--; 
1990/0227    
				old = (PTEA*)pte; 
				pte = pte->nextva; 
				lock(&modalloc); 
1990/1115/sys/src/9/port/page.c:653,6591990/11211/sys/src/9/port/page.c:648,654
1990/0802    
	unlock(&ptealloc); 
1990/0814    
	unlock(o); 
1990/0802    
	if(u && u->p) 
		error(0, Enovmem); 
1990/11211    
		error(Enovmem); 
1990/0802    
	panic("growpte fails %d %lux %d\n", n, o->va, o->npte); 
1990/0227    
} 
 
1990/11211/sys/src/9/port/page.c:336,3421990/1126/sys/src/9/port/page.c:336,342 (short | long)
1990/0303    
			o->mqid = c->mqid; 
1990/0227    
			incref(c); 
		}else{ 
			o->type = -1; 
1990/1126    
			o->type = ~0; 
1990/11211    
			o->qid = (Qid){~0, ~0}; 
			o->mqid = (Qid){~0, ~0}; 
1990/0303    
			o->mchan = 0; 
1990/1126/sys/src/9/port/page.c:70,751990/1211/sys/src/9/port/page.c:70,77 (short | long)
Created.
rsc Fri Mar 4 12:44:25 2005
1990/0227    
		palloc.addr += BY2PG-1; 
		palloc.addr &= ~(BY2PG-1); 
	} 
1990/1211    
	if(palloc.addr >= conf.maxialloc) 
		panic("keep bill joy away"); 
1990/0227    
	return (void*)(p|KZERO); 
} 
 
1990/1126/sys/src/9/port/page.c:151,1571990/1211/sys/src/9/port/page.c:153,162
1990/0227    
	for(p=palloc.head; p<=palloc.tail; p++,ppn++){ 
		p->next = p+1; 
		p->prev = p-1; 
		p->pa = ppn<<PGSHIFT; 
1990/1211    
		if(ppn < conf.npage0) 
			p->pa = conf.base0+(ppn<<PGSHIFT); 
		else 
			p->pa = conf.base1+((ppn-conf.npage0)<<PGSHIFT); 
1990/0227    
	} 
	palloc.head->prev = 0; 
	palloc.tail->next = 0; 
1990/1211/sys/src/9/port/page.c:55,611990/1212/sys/src/9/port/page.c:55,61 (short | long)
1990/0227    
{ 
	ulong p; 
 
	if(palloc.active) 
1990/1212    
	if(palloc.active && n!=0) 
1990/0227    
		print("ialloc bad\n"); 
	if(palloc.addr == 0) 
		palloc.addr = ((ulong)&end)&~KZERO; 
1990/1211/sys/src/9/port/page.c:185,1911990/1212/sys/src/9/port/page.c:185,191
1990/0227    
					continue; 
				} 
				print("free %d pages va %lux %lux %c\n", o1->npage, o->va, o1->qid, devchar[o1->type]); 
				freepage(o1); 
1990/1212    
				freepage(o1, 0); 
1990/0227    
				/* neworig will free the orig and pte's later */ 
				unlock(o1); 
				if(p->ref == 0) 
1990/1211/sys/src/9/port/page.c:367,3731990/1212/sys/src/9/port/page.c:367,373
1990/0227    
				unlock(o); 
				continue; 
			} 
			freepage(o); 
1990/1212    
			freepage(o, 1); 
1990/0227    
			freepte(o); 
			unlock(o); 
			o->next = origalloc.free; 
1990/1211/sys/src/9/port/page.c:506,5121990/1212/sys/src/9/port/page.c:506,512
1990/0227    
				close(c); 
			} 
			if(!(o->flag&OCACHED) || o->npage==0){ 
				freepage(o); 
1990/1212    
				freepage(o, 1); 
1990/0227    
				freepte(o); 
				unlock(o); 
				lock(&origalloc); 
1990/1211/sys/src/9/port/page.c:566,5721990/1212/sys/src/9/port/page.c:566,572
1990/0227    
 * o is locked 
 */ 
void 
freepage(Orig *o) 
1990/1212    
freepage(Orig *o, int dolock) 
1990/0227    
{ 
	PTE *pte; 
	Page *pg; 
1990/1211/sys/src/9/port/page.c:576,5821990/1212/sys/src/9/port/page.c:576,582
1990/0227    
	for(i=0; i<o->npte; i++,pte++) 
		if(pg = pte->page){	/* assign = */ 
			if(pg->ref == 1){ 
1990/0801    
				unusepage(pg, 1); 
1990/1212    
				unusepage(pg, dolock); 
1990/0227    
				pte->page = 0; 
				pg->o = 0; 
			} 
1990/1212/sys/src/9/port/page.c:341,3471990/1214/sys/src/9/port/page.c:341,347 (short | long)
1990/0303    
			o->mqid = c->mqid; 
1990/0227    
			incref(c); 
		}else{ 
1990/1126    
			o->type = ~0; 
1990/1214    
			o->type = 0xFFFF; 
1990/11211    
			o->qid = (Qid){~0, ~0}; 
			o->mqid = (Qid){~0, ~0}; 
1990/0303    
			o->mchan = 0; 
1990/1214/sys/src/9/port/page.c:698,7031990/1226/sys/src/9/port/page.c:698,703 (short | long)
1990/0227    
	unlock(&ptealloc); 
1990/0802    
	if(u && u->p) 
		print("%s: %s: ", u->p->text, u->p->pgrp->user); 
	print("compactpte fails addr %lux\n", o->va+n*BY2PG); 
1990/1226    
	print("compactpte fails addr %lux %lux %d\n", o->va+n*BY2PG, o->va, n); 
1990/0802    
	return 0; 
1990/0227    
} 
1990/1226/sys/src/9/port/page.c:85,911991/0110/sys/src/9/port/page.c:85,91 (short | long)
1990/0303    
	do;while(here); 
	here=1; 
1990/0227    
	p = palloc.head; 
	nf=nb=0; 
1991/0110    
	nf = nb = 0; 
1990/0227    
	while(p){ 
1990/0303    
		print("%lux %lux %d\n", p->pa, p->va, p->ref); 
		if(p->o){ 
1990/1226/sys/src/9/port/page.c:208,2141991/0110/sys/src/9/port/page.c:208,214
1990/0227    
	goto loop; 
    out: 
	if(p->o){ 
		print("page in use %lux %lux %lux\n", p->va, p->o, origalloc.arena); 
1991/0110    
		print("page in use %lux %lux %lux %lux\n", p, p->va, p->o, origalloc.arena); 
1990/0227    
		print("%c %lux %lux, %d %d %d\n", devchar[p->o->type], p->o->va, p->o->qid, p->o->flag, p->o->nproc, p->o->npte); 
		panic("shit"); 
	} 
1991/0110/sys/src/9/port/page.c:464,4691991/0115/sys/src/9/port/page.c:464,475 (short | long)
1990/0227    
	Page *pg; 
	Chan *c; 
 
1991/0115    
	/* 
	 * flushvirt() is a no-op on machines without virtual write-back caches. 
	 * On such machines it is necessary to make sure the caches are flushed 
	 * before the pages are remapped. 
	 */ 
	flushvirt(); 
1990/0227    
	s = u->p->seg; 
	for(i=0; i<NSEG; i++,s++){ 
		if(i == save) 
1991/0115/sys/src/9/port/page.c:630,6361991/0318/sys/src/9/port/page.c:630,636 (short | long)
1990/0814    
				goto Trouble; 
			p = ptealloc.free; 
			ptealloc.free += n; 
			memcpy(p+1, o->pte, o->npte*sizeof(PTE)); 
1991/0318    
			memmove(p+1, o->pte, o->npte*sizeof(PTE)); 
1990/0814    
			p->o = o; 
			((PTEA*)(o->pte-1))->o = 0; 
			o->pte = p+1; 
1991/0115/sys/src/9/port/page.c:689,6951991/0318/sys/src/9/port/page.c:689,695
1990/0227    
				unlock(p2o); 
				goto Free; 
			} 
			memcpy(p1, p2, p2->n*sizeof(PTE)); 
1991/0318    
			memmove(p1, p2, p2->n*sizeof(PTE)); 
1990/0227    
			p2o->pte = p1+1; 
			if(p2o != o) 
				unlock(p2o); 
1991/0318/sys/src/9/port/page.c:47,521991/0425/sys/src/9/port/page.c:47,54 (short | long)
1990/0227    
	PTEA	*free; 
}modalloc; 
 
1991/0425    
extern long end; 
 
1990/0227    
/* 
 * Called to allocate permanent data structures, before calling pageinit(). 
 */ 
1991/0425/sys/src/9/port/page.c:61,771991/0606/sys/src/9/port/page.c:61,75 (short | long)
1990/0227    
		print("ialloc bad\n"); 
	if(palloc.addr == 0) 
		palloc.addr = ((ulong)&end)&~KZERO; 
	if(align){ 
		palloc.addr += BY2PG-1; 
		palloc.addr &= ~(BY2PG-1); 
	} 
1991/0606    
	if(align) 
		palloc.addr = PGROUND(palloc.addr); 
 
1990/0227    
	memset((void*)(palloc.addr|KZERO), 0, n); 
	p = palloc.addr; 
	palloc.addr += n; 
	if(align){ 
		palloc.addr += BY2PG-1; 
		palloc.addr &= ~(BY2PG-1); 
	} 
1991/0606    
	if(align) 
		palloc.addr = PGROUND(palloc.addr); 
 
1990/1211    
	if(palloc.addr >= conf.maxialloc) 
		panic("keep bill joy away"); 
1990/0227    
	return (void*)(p|KZERO); 
1991/0425/sys/src/9/port/page.c:549,5551991/0606/sys/src/9/port/page.c:547,553
1990/0227    
		return 0; 
	if(min != s->minva)	/* can't grow down yet (stacks: fault.c) */ 
		return 0; 
	max = (max+(BY2PG-1)) & ~(BY2PG-1); 
1991/0606    
	max = PGROUND(max); 
1990/0227    
	o = s->o; 
	if(max == s->maxva) 
		return 1; 
1991/0425/sys/src/9/port/page.c:707,7111991/0606/sys/src/9/port/page.c:705,739
1990/0802    
	if(u && u->p) 
		print("%s: %s: ", u->p->text, u->p->pgrp->user); 
1990/1226    
	print("compactpte fails addr %lux %lux %d\n", o->va+n*BY2PG, o->va, n); 
1991/0606    
	return 0; 
} 
 
long 
ibrk(ulong addr, int seg) 
{ 
	Seg *s; 
 
	s = &u->p->seg[seg]; 
	if(seg == LSEG && s->o == 0) 
		mklockseg(s); 
 
	/* Allows us to determine the base of the segment */ 
	if(addr == 0) 
		return s->minva; 
 
	if(addr < s->endseg){ 
		pprint("addr below segment\n"); 
		pexit("Suicide", 0); 
		error(Esegaddr); 
	} 
 
	if(addr > PGROUND(s->endseg)) 
		if(segaddr(s, s->minva, addr) == 0){ 
			pprint("bad segaddr in brk\n"); 
			pexit("Suicide", 0); 
			error(Esegaddr); 
		} 
 
	s->endseg = addr; 
1990/0802    
	return 0; 
1990/0227    
} 
1991/0606/sys/src/9/port/page.c:334,3391991/0607/sys/src/9/port/page.c:334,340 (short | long)
1990/0227    
		o->nproc = 1; 
		o->npage = 0; 
		o->chan = c; 
1991/0607    
		o->freepg = unusepage; 
1990/0227    
		if(c){ 
			o->type = c->type; 
			o->qid = c->qid; 
1991/0606/sys/src/9/port/page.c:428,4351991/0607/sys/src/9/port/page.c:429,434
1990/0227    
	ppte = 0; 
	pte = old->mod; 
	while(pte){ 
if(pte->page==0) panic("forkmod zero page"); 
if(pte->proc != u->p) panic("forkmod wrong page"); 
1990/1013    
		npte = newmod(o); 
1990/0227    
		npte->proc = p; 
		npte->page = pte->page; 
1991/0606/sys/src/9/port/page.c:579,5931991/0607/sys/src/9/port/page.c:578,593
1990/0227    
	int i; 
 
	pte = o->pte; 
	for(i=0; i<o->npte; i++,pte++) 
1991/0607    
	for(i=0; i<o->npte; i++,pte++) { 
1990/0227    
		if(pg = pte->page){	/* assign = */ 
			if(pg->ref == 1){ 
1990/1212    
				unusepage(pg, dolock); 
1991/0607    
				(*o->freepg)(pg, dolock); 
1990/0227    
				pte->page = 0; 
				pg->o = 0; 
			} 
			pg->ref--; 
		} 
1991/0607    
	} 
1990/0227    
	o->npage = 0; 
} 
 
Too many diffs (26 > 25). Stopping.


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)