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

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

1990/0802/sys/src/9/port/page.c:339,3471990/0814/sys/src/9/port/page.c:339,345 (short | long | prev | next)
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); 


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