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

1992/0303/port/swap.c (diff list | history)

1992/0302/sys/src/9/port/swap.c:15,231992/0303/sys/src/9/port/swap.c:15,25 (short | long | prev | next)
1991/0705    
 
enum 
{ 
1992/0302    
	Maxpages = 100,		/* Max number of pageouts per segment pass */ 
1992/0303    
	Maxpages = 500,		/* Max number of pageouts per segment pass */ 
1991/0705    
}; 
 
1992/0303    
#define DBG	if(1)print 
 
1991/0705    
Image 	swapimage; 
static 	int swopen; 
Page	*iolist[Maxpages]; 
1992/0302/sys/src/9/port/swap.c:103,1451992/0303/sys/src/9/port/swap.c:105,153
1991/0705    
	Segment *s; 
	int i; 
 
1992/0303    
	if(waserror())  
		panic("pager: os error\n"); 
 
1991/1115    
	USED(junk); 
1991/0705    
	p = proctab(0); 
	ep = &p[conf.nproc]; 
	for(;;) { 
		if(waserror())  
			panic("pager: os error\n"); 
 
1992/0301    
		u->p->psstate = "Idle"; 
		sleep(&swapalloc.r, needpages, 0); 
		u->p->psstate = "Pageout"; 
1992/0303    
loop: 
	u->p->psstate = "Idle"; 
	sleep(&swapalloc.r, needpages, 0); 
	u->p->psstate = "Pageout"; 
1992/0301    
 
1991/0705    
		for(p = proctab(0); p < ep; p++) { 
			if(p->state == Dead || p->kp) 
				continue; 
1992/0303    
	for(;;) { 
		p++; 
		if(p > ep) 
			p = proctab(0); 
1991/0705    
 
			if(swapimage.c) { 
				for(i = 0; i < NSEG; i++) 
					if(s = p->seg[i]) { 
						pageout(p, s); 
						executeio(); 
					} 
			} 
1991/0727    
			else  
			if(palloc.freecount < HIGHWATER) { 
1992/0130    
				/* Rob made me do it ! */ 
				if(conf.cntrlp == 0) 
					freebroken(); 
1992/0303    
		if(p->state == Dead || p->kp) 
			continue; 
1992/0130    
 
1991/0705    
				/* Emulate the old system if no swap channel */ 
				print("no physical memory\n"); 
				tsleep(&swapalloc.r, return0, 0, 1000); 
				wakeup(&palloc.r); 
1992/0303    
		if(swapimage.c) { 
			for(i = 0; i < NSEG; i++) { 
				if(!needpages(junk)) 
					goto loop; 
				if(s = p->seg[i]) { 
					pageout(p, s); 
					executeio(); 
				} 
1991/0705    
			} 
		} 
1992/0303    
		else  
		if(palloc.freecount < swapalloc.highwater) { 
			/* Rob made me do it ! */ 
			if(conf.cntrlp == 0) 
				freebroken(); 
1991/0705    
 
		poperror(); 
1992/0303    
			/* Emulate the old system if no swap channel */ 
			print("no physical memory\n"); 
			tsleep(&swapalloc.r, return0, 0, 1000); 
			wakeup(&palloc.r); 
		} 
1991/0705    
	} 
1992/0303    
	goto loop; 
1991/0705    
} 
 
void			 
1992/0302/sys/src/9/port/swap.c:147,1641992/0303/sys/src/9/port/swap.c:155,179
1991/0705    
{ 
1992/0302    
	Pte **sm, **endsm, *l; 
	Page **pg, *entry; 
1991/0705    
	int type; 
1992/0303    
	int type, nr; 
1992/0302    
extern char *sname[]; 
1991/0705    
 
1992/0303    
 
1991/0705    
	if(!canqlock(&s->lk))	/* We cannot afford to wait, we will surely deadlock */ 
		return; 
 
	if(!canflush(p, s) || s->steal) { 
1992/0303    
	if(s->steal) { 
1991/0705    
		qunlock(&s->lk); 
		putseg(s); 
		return; 
	} 
 
1992/0303    
	if(!canflush(p, s)) { 
		qunlock(&s->lk); 
		putseg(s); 
		return; 
	} 
 
1991/0705    
	if(waserror()) { 
		qunlock(&s->lk); 
		putseg(s); 
1992/0302/sys/src/9/port/swap.c:166,1711992/0303/sys/src/9/port/swap.c:181,187
1991/0705    
	} 
 
1992/0302    
	scavenge = 0; 
1992/0303    
	nr = 0; 
1992/0302    
 
1991/0705    
	/* Pass through the pte tables looking for memory pages to swap out */ 
	type = s->type&SG_TYPE; 
1992/0302/sys/src/9/port/swap.c:175,1871992/0303/sys/src/9/port/swap.c:191,203
1992/0302    
		if(l == 0) 
			continue; 
		for(pg = l->first; pg < l->last; pg++) { 
1992/0303    
			nr++; 
1992/0302    
			entry = *pg; 
			if(pagedout(entry)) 
				continue; 
			if(entry->modref & PG_REF) { 
				print("MODREF\n"); 
1992/0303    
 
			if(entry->modref & PG_REF) 
1992/0302    
				entry->modref &= ~PG_REF; 
			} 
			else  
				pagepte(type, s, pg); 
1991/0705    
 
1992/0302/sys/src/9/port/swap.c:190,1971992/0303/sys/src/9/port/swap.c:206,214
1992/0302    
		} 
	} 
out: 
	                 
	print("%s: %d: type %s %d pages\n", p->text, p->pid, sname[type], scavenge); 
1992/0303    
	DBG("%s: %d: %5s s %d nr %d fr %d\n",  
	p->text, p->pid, sname[type], scavenge, nr, palloc.freecount); 
 
1991/0705    
	poperror(); 
	qunlock(&s->lk); 
	putseg(s); 
1992/0302/sys/src/9/port/swap.c:235,2481992/0303/sys/src/9/port/swap.c:252,260
1991/0705    
pagepte(int type, Segment *s, Page **pg) 
{ 
	ulong daddr; 
	char *kaddr; 
	int n; 
	Chan *c; 
	Page *outp; 
	KMap *k; 
 
	outp = *pg; 
1992/0302    
print("outp: %lux\n", *pg); 
1991/0705    
	switch(type) { 
	case SG_TEXT:					/* Revert to demand load */ 
		putpage(outp); 
1992/0302/sys/src/9/port/swap.c:290,3061992/0303/sys/src/9/port/swap.c:302,308
1991/0705    
 
	for(i = 0; i < ioptr; i++) { 
		out = iolist[i]; 
1992/0301    
#ifdef asdf 
1991/0705    
		if(out->ref > 2) { 
			lockpage(out); 
1992/0301    
			if(out->ref > 2) {	 
1991/0705    
				out->ref -= 2; 
				unlockpage(out); 
				continue; 
			} 
			unlockpage(out); 
		} 
1992/0301    
#endif 
1992/0303    
 
1991/0705    
		k = kmap(out); 
		kaddr = (char*)VA(k); 
		qlock(&c->wrl); 
1992/0302/sys/src/9/port/swap.c:330,3361992/0303/sys/src/9/port/swap.c:332,338
1991/0705    
needpages(void *p) 
{ 
1991/1115    
	USED(p); 
1991/0705    
	return palloc.freecount < HIGHWATER+MAXHEADROOM; 
1992/0303    
	return palloc.freecount < swapalloc.headroom; 
1991/0705    
} 
 
void 


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