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

1990/0802/port/page.c (diff list | history)

1990/0801/sys/src/9/port/page.c:4,91990/0802/sys/src/9/port/page.c:4,10 (short | long | prev | next)
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    
} 


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