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

1994/0509/port/swap.c (diff list | history)

1991/0705/sys/src/9/port/swap.c:9,151991/0706/sys/src/9/port/swap.c:9,14 (short | long)
1991/0705    
/* Predeclaration */ 
void	pageout(Proc *p, Segment*); 
int	pagepte(int, Segment*, Page**); 
void	openswap(void); 
int	needpages(void*); 
void	pager(void*); 
void	executeio(void); 
1991/0705/sys/src/9/port/swap.c:17,231991/0706/sys/src/9/port/swap.c:16,22
1991/0705    
 
enum 
{ 
	Maxpages = 500,		/* Max number of pageouts per process pass */ 
1991/0706    
	Maxpages = 500,		/* Max number of pageouts per segment pass */ 
1991/0705    
}; 
 
Image 	swapimage; 
1991/0705/sys/src/9/port/swap.c:196,2021991/0706/sys/src/9/port/swap.c:195,201
1991/0705    
	unlock(s); 
 
	/* Now we must do hardwork to ensure all processes which have tlb 
	 * entries for this segment are flushed 
1991/0706    
	 * entries for this segment will be flushed if we suceed in pageing it out 
1991/0705    
	 */ 
	p = proctab(0); 
	ep = &p[conf.nproc]; 
1991/0706/sys/src/9/port/swap.c:124,1301991/0720/sys/src/9/port/swap.c:124,129 (short | long)
1991/0705    
			else { 
				/* Emulate the old system if no swap channel */ 
				print("no physical memory\n"); 
				pprint("no physical memory\n"); 
				tsleep(&swapalloc.r, return0, 0, 1000); 
				wakeup(&palloc.r); 
			} 
1991/0720/sys/src/9/port/swap.c:114,1191991/0726/sys/src/9/port/swap.c:114,121 (short | long)
1991/0705    
 
			sleep(&swapalloc.r, needpages, 0); 
 
1991/0726    
			if(p->state == Dead || p->kp) 
				continue; 
1991/0705    
			if(swapimage.c) { 
				for(i = 0; i < NSEG; i++) 
					if(s = p->seg[i]) { 
1991/0726/sys/src/9/port/swap.c:123,1291991/0727/sys/src/9/port/swap.c:123,130 (short | long)
1991/0705    
						executeio(); 
					} 
			} 
			else { 
1991/0727    
			else  
			if(palloc.freecount < HIGHWATER) { 
1991/0705    
				/* Emulate the old system if no swap channel */ 
				print("no physical memory\n"); 
				tsleep(&swapalloc.r, return0, 0, 1000); 
1991/0727/sys/src/9/port/swap.c:112,1181991/0926/sys/src/9/port/swap.c:112,120 (short | long)
1991/0705    
			if(p->state == Dead || p->kp) 
				continue; 
 
1991/0926    
			u->p->psstate = "Idle"; 
1991/0705    
			sleep(&swapalloc.r, needpages, 0); 
1991/0926    
			u->p->psstate = "Pageout"; 
1991/0705    
 
1991/0726    
			if(p->state == Dead || p->kp) 
				continue; 
1991/0926/sys/src/9/port/swap.c:61,661991/0928/sys/src/9/port/swap.c:61,67 (short | long)
1991/0705    
		swapalloc.alloc = look+1; 
 
	*look = 1; 
1991/0928    
	swapalloc.free--; 
1991/0705    
	unlock(&swapalloc); 
	return (look-swapalloc.swmap) * BY2PG;  
} 
1991/0928/sys/src/9/port/swap.c:103,1081991/1115/sys/src/9/port/swap.c:103,109 (short | long)
1991/0705    
	Segment *s; 
	int i; 
 
1991/1115    
	USED(junk); 
1991/0705    
	p = proctab(0); 
	ep = &p[conf.nproc]; 
	for(;;) { 
1991/0928/sys/src/9/port/swap.c:320,3251991/1115/sys/src/9/port/swap.c:321,327
1991/0705    
int 
needpages(void *p) 
{ 
1991/1115    
	USED(p); 
1991/0705    
	return palloc.freecount < HIGHWATER+MAXHEADROOM; 
} 
 
1991/1115/sys/src/9/port/swap.c:4,101992/0111/sys/src/9/port/swap.c:4,10 (short | long)
Move error.h to ../port. Change errors to actual strings.
rsc Fri Mar 4 12:44:25 2005
1991/0705    
#include	"dat.h" 
#include	"fns.h" 
#include	"ureg.h" 
#include	"errno.h" 
1992/0111    
#include	"../port/error.h" 
1991/0705    
 
/* Predeclaration */ 
void	pageout(Proc *p, Segment*); 
1992/0111/sys/src/9/port/swap.c:330,3361992/0114/sys/src/9/port/swap.c:330,336 (short | long)
1991/0705    
{ 
	if(swapimage.c) { 
		if(swapalloc.free != conf.nswap) 
			errors("swap channel busy"); 
1992/0114    
			error(Einuse); 
1991/0705    
		close(swapimage.c); 
	} 
	incref(c); 
1992/0114/sys/src/9/port/swap.c:3,91992/0120/sys/src/9/port/swap.c:3,8 (short | long)
1991/0705    
#include	"mem.h" 
#include	"dat.h" 
#include	"fns.h" 
#include	"ureg.h" 
1992/0111    
#include	"../port/error.h" 
1991/0705    
 
/* Predeclaration */ 
1992/0120/sys/src/9/port/swap.c:128,1331992/0130/sys/src/9/port/swap.c:128,137 (short | long)
1991/0705    
			} 
1991/0727    
			else  
			if(palloc.freecount < HIGHWATER) { 
1992/0130    
				/* Rob made me do it ! */ 
				if(conf.cntrlp == 0) 
					freebroken(); 
 
1991/0705    
				/* Emulate the old system if no swap channel */ 
				print("no physical memory\n"); 
				tsleep(&swapalloc.r, return0, 0, 1000); 
1992/0130/sys/src/9/port/swap.c:15,211992/0301/sys/src/9/port/swap.c:15,21 (short | long)
1991/0705    
 
enum 
{ 
1991/0706    
	Maxpages = 500,		/* Max number of pageouts per segment pass */ 
1992/0301    
	Maxpages = 300,		/* Max number of pageouts per segment pass */ 
1991/0705    
}; 
 
Image 	swapimage; 
1992/0130/sys/src/9/port/swap.c:109,1241992/0301/sys/src/9/port/swap.c:109,122
1991/0705    
		if(waserror())  
			panic("pager: os error\n"); 
 
1992/0301    
		u->p->psstate = "Idle"; 
		sleep(&swapalloc.r, needpages, 0); 
		u->p->psstate = "Pageout"; 
 
1991/0705    
		for(p = proctab(0); p < ep; p++) { 
			if(p->state == Dead || p->kp) 
				continue; 
 
1991/0926    
			u->p->psstate = "Idle"; 
1991/0705    
			sleep(&swapalloc.r, needpages, 0); 
1991/0926    
			u->p->psstate = "Pageout"; 
1991/0705    
                 
1991/0726    
			if(p->state == Dead || p->kp) 
				continue; 
1991/0705    
			if(swapimage.c) { 
				for(i = 0; i < NSEG; i++) 
					if(s = p->seg[i]) { 
1992/0130/sys/src/9/port/swap.c:235,2511992/0301/sys/src/9/port/swap.c:233,238
1991/0705    
		*pg = 0; 
		break; 
	case SG_DATA: 
		/* Unmodified data may be reverted to a demand load record if it 
		 * is not the last page in the DSEG 
		 */ 
/*							BUG: needs to check the last page 
		if((outp->modref&PG_MOD) == 0) { 
			putpage(outp); 
			*pg = 0; 
			break; 
		} 
*/ 
							/* NO break */	 
	case SG_BSS: 
	case SG_STACK: 
	case SG_SHARED: 
1992/0130/sys/src/9/port/swap.c:284,2921992/0301/sys/src/9/port/swap.c:271,280
1991/0705    
 
	for(i = 0; i < ioptr; i++) { 
		out = iolist[i]; 
1992/0301    
#ifdef asdf 
1991/0705    
		if(out->ref > 2) { 
			lockpage(out); 
			if(out->ref > 2) {		/* Page was reclaimed, abort io */ 
1992/0301    
			if(out->ref > 2) {	 
1991/0705    
				out->ref -= 2; 
				unlockpage(out); 
				continue; 
1992/0130/sys/src/9/port/swap.c:293,2981992/0301/sys/src/9/port/swap.c:281,287
1991/0705    
			} 
			unlockpage(out); 
		} 
1992/0301    
#endif 
1991/0705    
		k = kmap(out); 
		kaddr = (char*)VA(k); 
		qlock(&c->wrl); 
1992/0301/sys/src/9/port/swap.c:15,211992/0302/sys/src/9/port/swap.c:15,21 (short | long)
1991/0705    
 
enum 
{ 
1992/0301    
	Maxpages = 300,		/* Max number of pageouts per segment pass */ 
1992/0302    
	Maxpages = 100,		/* Max number of pageouts per segment pass */ 
1991/0705    
}; 
 
Image 	swapimage; 
1992/0301/sys/src/9/port/swap.c:22,271992/0302/sys/src/9/port/swap.c:22,28
1991/0705    
static 	int swopen; 
Page	*iolist[Maxpages]; 
int	ioptr; 
1992/0302    
int	scavenge; 
1991/0705    
 
void 
swapinit(void) 
1992/0301/sys/src/9/port/swap.c:144,1521992/0302/sys/src/9/port/swap.c:145,154
1991/0705    
void			 
pageout(Proc *p, Segment *s) 
{ 
	Pte **sm, **endsm; 
	Page **pg, **epg; 
1992/0302    
	Pte **sm, **endsm, *l; 
	Page **pg, *entry; 
1991/0705    
	int type; 
1992/0302    
extern char *sname[]; 
1991/0705    
 
	if(!canqlock(&s->lk))	/* We cannot afford to wait, we will surely deadlock */ 
		return; 
1992/0301/sys/src/9/port/swap.c:163,1881992/0302/sys/src/9/port/swap.c:165,200
1991/0705    
		return; 
	} 
 
1992/0302    
	scavenge = 0; 
 
1991/0705    
	/* Pass through the pte tables looking for memory pages to swap out */ 
	type = s->type&SG_TYPE; 
	endsm = &s->map[SEGMAPSIZE]; 
	for(sm = s->map; sm < endsm && ioptr < Maxpages; sm++) 
		if(*sm) { 
			pg = (*sm)->pages; 
			for(epg = &pg[PTEPERTAB]; pg < epg && ioptr < Maxpages; pg++) 
				if(!pagedout(*pg)) { 
					if((*pg)->modref & PG_REF) 
						(*pg)->modref &= ~PG_REF; 
					else  
					if(pagepte(type, s, pg) == 0) 
						break; 
				} 
		} 
1992/0302    
	for(sm = s->map; sm < endsm; sm++) { 
		l = *sm; 
		if(l == 0) 
			continue; 
		for(pg = l->first; pg < l->last; pg++) { 
			entry = *pg; 
			if(pagedout(entry)) 
				continue; 
			if(entry->modref & PG_REF) { 
				print("MODREF\n"); 
				entry->modref &= ~PG_REF; 
			} 
			else  
				pagepte(type, s, pg); 
1991/0705    
 
1992/0302    
			if(ioptr >= Maxpages) 
				goto out; 
		} 
	} 
out: 
	 
	print("%s: %d: type %s %d pages\n", p->text, p->pid, sname[type], scavenge); 
1991/0705    
	poperror(); 
	qunlock(&s->lk); 
	putseg(s); 
                 
	wakeup(&palloc.r); 
} 
 
1992/0301/sys/src/9/port/swap.c:206,2171992/0302/sys/src/9/port/swap.c:218,233
1991/0705    
	 */ 
	p = proctab(0); 
	ep = &p[conf.nproc]; 
	for(; p < ep; p++) 
		if(p->state != Dead) 
1992/0302    
	while(p < ep) { 
		if(p->state != Dead) { 
1991/0705    
			for(i = 0; i < NSEG; i++) 
				if(p->seg[i] == s) 
					if(!canpage(p)) 
						return 0; 
1992/0302    
		} 
		p++; 
	} 
 
1991/0705    
	return 1;						 
} 
 
1992/0301/sys/src/9/port/swap.c:226,2371992/0302/sys/src/9/port/swap.c:242,255
1991/0705    
	KMap *k; 
 
	outp = *pg; 
                 
1992/0302    
print("outp: %lux\n", *pg); 
1991/0705    
	switch(type) { 
	case SG_TEXT:					/* Revert to demand load */ 
		putpage(outp); 
		*pg = 0; 
1992/0302    
		scavenge++; 
1991/0705    
		break; 
1992/0302    
 
1991/0705    
	case SG_DATA: 
	case SG_BSS: 
	case SG_STACK: 
1992/0301/sys/src/9/port/swap.c:253,2581992/0302/sys/src/9/port/swap.c:271,277
1991/0705    
 
		/* Add me to IO transaction list */ 
		iolist[ioptr++] = outp; 
1992/0302    
		scavenge++; 
1991/0705    
	} 
 
	return 1; 
1992/0301/sys/src/9/port/swap.c:286,2941992/0302/sys/src/9/port/swap.c:305,310
1991/0705    
		kaddr = (char*)VA(k); 
		qlock(&c->wrl); 
 
		/* BUG: what to do ? Nobody to tell, nowhere to go: open to suggestions  
		 *	the problem is I do not know whose page this is. 
		 */ 
		if(waserror()) 
			panic("executeio: page out I/O error"); 
 
1992/0302/sys/src/9/port/swap.c:15,231992/0303/sys/src/9/port/swap.c:15,25 (short | long)
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 
1992/0303/sys/src/9/port/swap.c:7,131992/0304/sys/src/9/port/swap.c:7,13 (short | long)
1991/0705    
 
/* Predeclaration */ 
void	pageout(Proc *p, Segment*); 
int	pagepte(int, Segment*, Page**); 
1992/0304    
void	pagepte(int, Segment*, Page**); 
1991/0705    
int	needpages(void*); 
void	pager(void*); 
void	executeio(void); 
1992/0303/sys/src/9/port/swap.c:18,301992/0304/sys/src/9/port/swap.c:18,27
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]; 
int	ioptr; 
1992/0302    
int	scavenge; 
1991/0705    
 
void 
swapinit(void) 
1992/0303/sys/src/9/port/swap.c:103,1091992/0304/sys/src/9/port/swap.c:100,106
1991/0705    
{ 
	Proc *p, *ep; 
	Segment *s; 
	int i; 
1992/0304    
	int i, type; 
1991/0705    
 
1992/0303    
	if(waserror())  
		panic("pager: os error\n"); 
1992/0303/sys/src/9/port/swap.c:130,1371992/0304/sys/src/9/port/swap.c:127,144
1992/0303    
				if(!needpages(junk)) 
					goto loop; 
				if(s = p->seg[i]) { 
					pageout(p, s); 
					executeio(); 
1992/0304    
					type = s->type&SG_TYPE; 
					switch(type) { 
					default: 
						break; 
					case SG_TEXT: 
					case SG_DATA: 
					case SG_BSS: 
					case SG_STACK: 
					case SG_SHARED: 
						pageout(p, s); 
						executeio(); 
					} 
1992/0303    
				} 
1991/0705    
			} 
		} 
1992/0303/sys/src/9/port/swap.c:155,1741992/0304/sys/src/9/port/swap.c:162,179
1991/0705    
{ 
1992/0302    
	Pte **sm, **endsm, *l; 
	Page **pg, *entry; 
1992/0303    
	int type, nr; 
1992/0302    
extern char *sname[]; 
1992/0304    
	int type; 
1991/0705    
 
1992/0303    
                 
1991/0705    
	if(!canqlock(&s->lk))	/* We cannot afford to wait, we will surely deadlock */ 
		return; 
 
1992/0303    
	if(s->steal) { 
1992/0304    
	if(s->steal) {		/* Protected by /dev/proc */ 
1991/0705    
		qunlock(&s->lk); 
		putseg(s); 
		return; 
	} 
 
1992/0303    
	if(!canflush(p, s)) { 
1992/0304    
	if(!canflush(p, s)) {	/* Able to invalidate all tlbs with references */ 
1992/0303    
		qunlock(&s->lk); 
		putseg(s); 
		return; 
1992/0303/sys/src/9/port/swap.c:180,1881992/0304/sys/src/9/port/swap.c:185,190
1991/0705    
		return; 
	} 
 
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; 
	endsm = &s->map[SEGMAPSIZE]; 
1992/0303/sys/src/9/port/swap.c:191,1971992/0304/sys/src/9/port/swap.c:193,198
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; 
1992/0303/sys/src/9/port/swap.c:206,2141992/0304/sys/src/9/port/swap.c:207,212
1992/0302    
		} 
	} 
out: 
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/0303/sys/src/9/port/swap.c:248,2541992/0304/sys/src/9/port/swap.c:246,252
1991/0705    
	return 1;						 
} 
 
int 
1992/0304    
void 
1991/0705    
pagepte(int type, Segment *s, Page **pg) 
{ 
	ulong daddr; 
1992/0303/sys/src/9/port/swap.c:259,2651992/0304/sys/src/9/port/swap.c:257,262
1991/0705    
	case SG_TEXT:					/* Revert to demand load */ 
		putpage(outp); 
		*pg = 0; 
1992/0302    
		scavenge++; 
1991/0705    
		break; 
1992/0302    
 
1991/0705    
	case SG_DATA: 
1992/0303/sys/src/9/port/swap.c:283,2921992/0304/sys/src/9/port/swap.c:280,286
1991/0705    
 
		/* Add me to IO transaction list */ 
		iolist[ioptr++] = outp; 
1992/0302    
		scavenge++; 
1991/0705    
	} 
                 
	return 1; 
} 
 
void 
1992/0303/sys/src/9/port/swap.c:324,3301992/0304/sys/src/9/port/swap.c:318,323
1991/0705    
		unlockpage(out); 
		putpage(out); 
	} 
                 
	ioptr = 0; 
} 
 
1992/0304/sys/src/9/port/swap.c:263,2681992/0307/sys/src/9/port/swap.c:263,269 (short | long)
1991/0705    
	case SG_BSS: 
	case SG_STACK: 
	case SG_SHARED: 
1992/0307    
	case SG_SHDATA: 
1991/0705    
		lockpage(outp); 
		outp->ref++; 
		uncachepage(outp); 
1992/0307/sys/src/9/port/swap.c:1,51992/0321/sys/src/9/port/swap.c:1,5 (short | long)
Move lib.h to ../port.
rsc Fri Mar 4 12:44:25 2005
1991/0705    
#include	"u.h" 
#include	"lib.h" 
1992/0321    
#include	"../port/lib.h" 
1991/0705    
#include	"mem.h" 
#include	"dat.h" 
#include	"fns.h" 
1992/0321/sys/src/9/port/swap.c:26,321992/0619/sys/src/9/port/swap.c:26,32 (short | long)
1991/0705    
void 
swapinit(void) 
{ 
	swapalloc.swmap = ialloc(conf.nswap, 0); 
1992/0619    
	swapalloc.swmap = xalloc(conf.nswap); 
1991/0705    
	swapalloc.top = &swapalloc.swmap[conf.nswap]; 
	swapalloc.alloc = swapalloc.swmap; 
 
1992/0619/sys/src/9/port/swap.c:264,2731992/0625/sys/src/9/port/swap.c:264,273 (short | long)
1991/0705    
	case SG_STACK: 
	case SG_SHARED: 
1992/0307    
	case SG_SHDATA: 
1991/0705    
		lockpage(outp); 
1992/0625    
		lock(outp); 
1991/0705    
		outp->ref++; 
		uncachepage(outp); 
		unlockpage(outp); 
1992/0625    
		unlock(outp); 
1991/0705    
 
		daddr = newswap(); 
		outp->daddr = daddr; 
1992/0619/sys/src/9/port/swap.c:314,3221992/0625/sys/src/9/port/swap.c:314,322
1991/0705    
		poperror(); 
 
		/* Free up the page after I/O */ 
		lockpage(out); 
1992/0625    
		lock(out); 
1991/0705    
		out->ref--; 
		unlockpage(out); 
1992/0625    
		unlock(out); 
1991/0705    
		putpage(out); 
	} 
	ioptr = 0; 
1992/0625/sys/src/9/port/swap.c:37,631992/0628/sys/src/9/port/swap.c:37,50 (short | long)
1991/0705    
newswap(void) 
{ 
	char *look; 
	int n; 
 
	lock(&swapalloc); 
	if(swapalloc.free == 0) 
		panic("out of swap space"); 
 
	n = swapalloc.top - swapalloc.alloc; 
	look = swapalloc.alloc; 
	while(n && *look) { 
		n--; 
		look++; 
	} 
	if(n == 0) { 
		look = swapalloc.swmap; 
		while(*look) 
			look++; 
	} 
	if(look == swapalloc.top) 
		swapalloc.alloc = swapalloc.swmap; 
	else 
		swapalloc.alloc = look+1; 
1992/0628    
	look = memchr(swapalloc.swmap, 0, conf.nswap); 
	if(look == 0) 
		panic("inconsistant swap"); 
1991/0705    
 
	*look = 1; 
1991/0928    
	swapalloc.free--; 
1992/0625/sys/src/9/port/swap.c:116,1221992/0628/sys/src/9/port/swap.c:103,109
1992/0301    
 
1992/0303    
	for(;;) { 
		p++; 
		if(p > ep) 
1992/0628    
		if(p >= ep) 
1992/0303    
			p = proctab(0); 
1991/0705    
 
1992/0303    
		if(p->state == Dead || p->kp) 
1992/0625/sys/src/9/port/swap.c:126,1311992/0628/sys/src/9/port/swap.c:113,119
1992/0303    
			for(i = 0; i < NSEG; i++) { 
				if(!needpages(junk)) 
					goto loop; 
1992/0628    
 
1992/0303    
				if(s = p->seg[i]) { 
1992/0304    
					type = s->type&SG_TYPE; 
					switch(type) { 
1992/0625/sys/src/9/port/swap.c:264,2811992/0628/sys/src/9/port/swap.c:252,269
1991/0705    
	case SG_STACK: 
	case SG_SHARED: 
1992/0307    
	case SG_SHDATA: 
1992/0628    
		daddr = newswap(); 
 
1992/0625    
		lock(outp); 
1991/0705    
		outp->ref++; 
		uncachepage(outp); 
1992/0625    
		unlock(outp); 
1991/0705    
 
		daddr = newswap(); 
		outp->daddr = daddr; 
                 
		/* Enter swap page into cache before segment is unlocked so that 
		 * a fault will cause a cache recovery rather than a pagein on a 
		 * partially written block. 
		 */ 
1992/0628    
		outp->daddr = daddr; 
1991/0705    
		cachepage(outp, &swapimage); 
		*pg = (Page*)(daddr|PG_ONSWAP); 
 
1992/0628/sys/src/9/port/swap.c:253,2591992/0629/sys/src/9/port/swap.c:253,259 (short | long)
1991/0705    
	case SG_SHARED: 
1992/0307    
	case SG_SHDATA: 
1992/0628    
		daddr = newswap(); 
                 
1992/0629    
		cachedel(&swapimage, daddr); 
1992/0625    
		lock(outp); 
1991/0705    
		outp->ref++; 
		uncachepage(outp); 
1992/0629/sys/src/9/port/swap.c:7,131992/0711/sys/src/9/port/swap.c:7,13 (short | long)
1991/0705    
 
/* Predeclaration */ 
void	pageout(Proc *p, Segment*); 
1992/0304    
void	pagepte(int, Segment*, Page**); 
1992/0711    
void	pagepte(int, Page**); 
1991/0705    
int	needpages(void*); 
void	pager(void*); 
void	executeio(void); 
1992/0629/sys/src/9/port/swap.c:188,1941992/0711/sys/src/9/port/swap.c:188,194
1992/0303    
			if(entry->modref & PG_REF) 
1992/0302    
				entry->modref &= ~PG_REF; 
			else  
				pagepte(type, s, pg); 
1992/0711    
				pagepte(type, pg); 
1991/0705    
 
1992/0302    
			if(ioptr >= Maxpages) 
				goto out; 
1992/0629/sys/src/9/port/swap.c:235,2411992/0711/sys/src/9/port/swap.c:235,241
1991/0705    
} 
 
1992/0304    
void 
1991/0705    
pagepte(int type, Segment *s, Page **pg) 
1992/0711    
pagepte(int type, Page **pg) 
1991/0705    
{ 
	ulong daddr; 
	Page *outp; 
1992/0711/sys/src/9/port/swap.c:132,1401992/0725/sys/src/9/port/swap.c:132,139 (short | long)
1991/0705    
		} 
1992/0303    
		else  
		if(palloc.freecount < swapalloc.highwater) { 
			/* Rob made me do it ! */ 
			if(conf.cntrlp == 0) 
				freebroken(); 
1992/0725    
			if(!cpuserver) 
				freebroken();	/* can use the memory */ 
1991/0705    
 
1992/0303    
			/* Emulate the old system if no swap channel */ 
			print("no physical memory\n"); 
1992/0725/sys/src/9/port/swap.c:21,271992/0804/sys/src/9/port/swap.c:21,27 (short | long)
1991/0705    
Image 	swapimage; 
static 	int swopen; 
Page	*iolist[Maxpages]; 
int	ioptr; 
1992/0804    
int	ioptr, npage; 
1991/0705    
 
void 
swapinit(void) 
1992/0725/sys/src/9/port/swap.c:101,1061992/0804/sys/src/9/port/swap.c:101,107
1992/0303    
	sleep(&swapalloc.r, needpages, 0); 
	u->p->psstate = "Pageout"; 
1992/0301    
 
1992/0804    
	npage = 0; 
1992/0303    
	for(;;) { 
		p++; 
1992/0628    
		if(p >= ep) 
1992/0725/sys/src/9/port/swap.c:141,1461992/0804/sys/src/9/port/swap.c:142,149
1992/0303    
			wakeup(&palloc.r); 
		} 
1991/0705    
	} 
1992/0804    
	if(npage == 0) 
		print("swap: pass took no pages\n"); 
1992/0303    
	goto loop; 
1991/0705    
} 
 
1992/0725/sys/src/9/port/swap.c:269,2741992/0804/sys/src/9/port/swap.c:272,278
1991/0705    
		/* Add me to IO transaction list */ 
		iolist[ioptr++] = outp; 
	} 
1992/0804    
	npage++; 
1991/0705    
} 
 
void 
1992/0804/sys/src/9/port/swap.c:21,271992/0805/sys/src/9/port/swap.c:21,27 (short | long)
1991/0705    
Image 	swapimage; 
static 	int swopen; 
Page	*iolist[Maxpages]; 
1992/0804    
int	ioptr, npage; 
1992/0805    
int	ioptr; 
1991/0705    
 
void 
swapinit(void) 
1992/0804/sys/src/9/port/swap.c:87,931992/0805/sys/src/9/port/swap.c:87,93
1991/0705    
{ 
	Proc *p, *ep; 
	Segment *s; 
1992/0304    
	int i, type; 
1992/0805    
	int i; 
1991/0705    
 
1992/0303    
	if(waserror())  
		panic("pager: os error\n"); 
1992/0804/sys/src/9/port/swap.c:99,1071992/0805/sys/src/9/port/swap.c:99,105
1992/0303    
loop: 
	u->p->psstate = "Idle"; 
	sleep(&swapalloc.r, needpages, 0); 
	u->p->psstate = "Pageout"; 
1992/0301    
 
1992/0804    
	npage = 0; 
1992/0303    
	for(;;) { 
		p++; 
1992/0628    
		if(p >= ep) 
1992/0804/sys/src/9/port/swap.c:116,1371992/0805/sys/src/9/port/swap.c:114,141
1992/0303    
					goto loop; 
1992/0628    
 
1992/0303    
				if(s = p->seg[i]) { 
1992/0304    
					type = s->type&SG_TYPE; 
					switch(type) { 
1992/0805    
					switch(s->type&SG_TYPE) { 
1992/0304    
					default: 
						break; 
					case SG_TEXT: 
1992/0805    
						pageout(p, s); 
						break; 
1992/0304    
					case SG_DATA: 
					case SG_BSS: 
					case SG_STACK: 
					case SG_SHARED: 
1992/0805    
						u->p->psstate = "Pageout"; 
1992/0304    
						pageout(p, s); 
						executeio(); 
1992/0805    
						if(ioptr != 0) { 
							u->p->psstate = "I/O"; 
							executeio(); 
						} 
1992/0304    
					} 
1992/0303    
				} 
1991/0705    
			} 
1992/0805    
			continue; 
1991/0705    
		} 
1992/0303    
		else  
1992/0805    
 
1992/0303    
		if(palloc.freecount < swapalloc.highwater) { 
1992/0725    
			if(!cpuserver) 
				freebroken();	/* can use the memory */ 
1992/0804/sys/src/9/port/swap.c:142,1491992/0805/sys/src/9/port/swap.c:146,151
1992/0303    
			wakeup(&palloc.r); 
		} 
1991/0705    
	} 
1992/0804    
	if(npage == 0) 
		print("swap: pass took no pages\n"); 
1992/0303    
	goto loop; 
1991/0705    
} 
 
1992/0804/sys/src/9/port/swap.c:150,1581992/0805/sys/src/9/port/swap.c:152,160
1991/0705    
void			 
pageout(Proc *p, Segment *s) 
{ 
1992/0302    
	Pte **sm, **endsm, *l; 
1992/0805    
	int type, i; 
	Pte *l; 
1992/0302    
	Page **pg, *entry; 
1992/0304    
	int type; 
1991/0705    
 
	if(!canqlock(&s->lk))	/* We cannot afford to wait, we will surely deadlock */ 
		return; 
1992/0804/sys/src/9/port/swap.c:177,1851992/0805/sys/src/9/port/swap.c:179,186
1991/0705    
 
	/* Pass through the pte tables looking for memory pages to swap out */ 
	type = s->type&SG_TYPE; 
	endsm = &s->map[SEGMAPSIZE]; 
1992/0302    
	for(sm = s->map; sm < endsm; sm++) { 
		l = *sm; 
1992/0805    
	for(i = 0; i < SEGMAPSIZE; i++) { 
		l = s->map[i]; 
1992/0302    
		if(l == 0) 
			continue; 
		for(pg = l->first; pg < l->last; pg++) { 
1992/0804/sys/src/9/port/swap.c:187,1971992/0805/sys/src/9/port/swap.c:188,200
1992/0302    
			if(pagedout(entry)) 
				continue; 
1992/0303    
 
			if(entry->modref & PG_REF) 
1992/0805    
			if(entry->modref & PG_REF) { 
1992/0302    
				entry->modref &= ~PG_REF; 
			else  
1992/0711    
				pagepte(type, pg); 
1992/0805    
				continue; 
			} 
1991/0705    
 
1992/0805    
			pagepte(type, pg); 
 
1992/0302    
			if(ioptr >= Maxpages) 
				goto out; 
		} 
1992/0804/sys/src/9/port/swap.c:206,2131992/0805/sys/src/9/port/swap.c:209,216
1991/0705    
int 
canflush(Proc *p, Segment *s) 
{ 
	Proc *ep; 
	int i; 
1992/0805    
	Proc *ep; 
1991/0705    
 
	lock(s); 
	if(s->ref == 1) {		/* Easy if we are the only user */ 
1992/0804/sys/src/9/port/swap.c:232,2381992/0805/sys/src/9/port/swap.c:235,240
1992/0302    
		} 
		p++; 
	} 
                 
1991/0705    
	return 1;						 
} 
 
1992/0804/sys/src/9/port/swap.c:272,2781992/0805/sys/src/9/port/swap.c:274,279
1991/0705    
		/* Add me to IO transaction list */ 
		iolist[ioptr++] = outp; 
	} 
1992/0804    
	npage++; 
1991/0705    
} 
 
void 
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)