~kris/9p

9hist

dc5712090fb4c76d322a7e645b44d366b676ed4f — David du Colombier 34 years ago bffc34b
Plan 9 from Bell Labs 1992-03-04
7 files changed, 23 insertions(+), 36 deletions(-)

M port/devarp.c
M port/deviproute.c
M port/fault.c
M port/ipdat.h
M port/page.c
M port/stip.c
M port/swap.c
M port/devarp.c => port/devarp.c +2 -1
@@ 328,7 328,8 @@ arpoput(Queue *q, Block *bp)

	/* if ip broadcast, use ether bcast address */
	addr = nhgetl(eh->dst);
	if(addr == Myip[Mybcast] || addr == Myip[Mynet] || addr == Myip[Mysubnet]){
	if(addr == Myip[Mybcast] || addr == Myip[Mynet]
	|| ((addr & Mymask) == Myip[Mynet+1] && (addr & ~Mynetmask) == ~Mynetmask)){
		memset(eh->d, 0xff, sizeof(eh->d));
		PUTNEXT(q, bp);
		return;

M port/deviproute.c => port/deviproute.c +1 -1
@@ 58,7 58,7 @@ iproute(uchar *dst, uchar *gate)
	ulong udst;

	udst = nhgetl(dst);
	if((udst&Mymask) == (Myip[Myself]&Mymask)){
	if((udst&Mynetmask) == (Myip[Myself]&Mynetmask)){
		memmove(gate, dst, 4);
		return;
	}

M port/fault.c => port/fault.c +0 -2
@@ 170,7 170,6 @@ pio(Segment *s, ulong addr, ulong soff, Page **p)
		new = lookpage(s->image, daddr);
	}
	else {
print("reclaim\n");
		daddr = swapaddr(loadrec);
		new = lookpage(&swapimage, daddr);
		if(new)


@@ 222,7 221,6 @@ print("reclaim\n");
			putpage(new);
	}
	else {					/* This is paged out */
print("SWAPIN\n");
		c = swapimage.c;
		qlock(&c->rdl);


M port/ipdat.h => port/ipdat.h +1 -0
@@ 511,6 511,7 @@ void	ipsetaddrs(void);

extern Ipaddr Myip[7];
extern Ipaddr Mymask;
extern Ipaddr Mynetmask;
extern Ipaddr classmask[4];
extern Ipconv *ipconv[];
extern char *tcpstate[];

M port/page.c => port/page.c +0 -6
@@ 237,14 237,11 @@ ispages(void *p)
void
putpage(Page *p)
{
	int wake;

	if(onswap(p)) {
		putswap(p);
		return;
	}

	wake = 0;
	lockpage(p);
	if(--p->ref == 0) {
		lock(&palloc);


@@ 273,13 270,10 @@ putpage(Page *p)
			p->prev = 0;
		}

		wake = 1;
		palloc.freecount++;		/* Release people waiting for memory */
		unlock(&palloc);
	}
	unlockpage(p);
	if(wake && palloc.wanted)
		wakeup(&palloc.r);
}

void

M port/stip.c => port/stip.c +1 -1
@@ 475,7 475,7 @@ ip_reassemble(int offset, Block *bp, Etherhdr *ip)
				(*l)->rptr += ovlap;
				break;
			}	
			last = *l;
			last = (*l)->next;
			freeb(*l);
			*l = last;
		}

M port/swap.c => port/swap.c +18 -25
@@ 7,7 7,7 @@

/* Predeclaration */
void	pageout(Proc *p, Segment*);
int	pagepte(int, Segment*, Page**);
void	pagepte(int, Segment*, Page**);
int	needpages(void*);
void	pager(void*);
void	executeio(void);


@@ 18,13 18,10 @@ enum
	Maxpages = 500,		/* Max number of pageouts per segment pass */
};

#define DBG	if(1)print

Image 	swapimage;
static 	int swopen;
Page	*iolist[Maxpages];
int	ioptr;
int	scavenge;

void
swapinit(void)


@@ 103,7 100,7 @@ pager(void *junk)
{
	Proc *p, *ep;
	Segment *s;
	int i;
	int i, type;

	if(waserror()) 
		panic("pager: os error\n");


@@ 130,8 127,18 @@ loop:
				if(!needpages(junk))
					goto loop;
				if(s = p->seg[i]) {
					pageout(p, s);
					executeio();
					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();
					}
				}
			}
		}


@@ 155,20 162,18 @@ pageout(Proc *p, Segment *s)
{
	Pte **sm, **endsm, *l;
	Page **pg, *entry;
	int type, nr;
extern char *sname[];

	int type;

	if(!canqlock(&s->lk))	/* We cannot afford to wait, we will surely deadlock */
		return;

	if(s->steal) {
	if(s->steal) {		/* Protected by /dev/proc */
		qunlock(&s->lk);
		putseg(s);
		return;
	}

	if(!canflush(p, s)) {
	if(!canflush(p, s)) {	/* Able to invalidate all tlbs with references */
		qunlock(&s->lk);
		putseg(s);
		return;


@@ 180,9 185,6 @@ extern char *sname[];
		return;
	}

	scavenge = 0;
	nr = 0;

	/* Pass through the pte tables looking for memory pages to swap out */
	type = s->type&SG_TYPE;
	endsm = &s->map[SEGMAPSIZE];


@@ 191,7 193,6 @@ extern char *sname[];
		if(l == 0)
			continue;
		for(pg = l->first; pg < l->last; pg++) {
			nr++;
			entry = *pg;
			if(pagedout(entry))
				continue;


@@ 206,9 207,6 @@ extern char *sname[];
		}
	}
out:
	DBG("%s: %d: %5s s %d nr %d fr %d\n", 
	p->text, p->pid, sname[type], scavenge, nr, palloc.freecount);

	poperror();
	qunlock(&s->lk);
	putseg(s);


@@ 248,7 246,7 @@ canflush(Proc *p, Segment *s)
	return 1;						
}

int
void
pagepte(int type, Segment *s, Page **pg)
{
	ulong daddr;


@@ 259,7 257,6 @@ pagepte(int type, Segment *s, Page **pg)
	case SG_TEXT:					/* Revert to demand load */
		putpage(outp);
		*pg = 0;
		scavenge++;
		break;

	case SG_DATA:


@@ 283,10 280,7 @@ pagepte(int type, Segment *s, Page **pg)

		/* Add me to IO transaction list */
		iolist[ioptr++] = outp;
		scavenge++;
	}

	return 1;
}

void


@@ 324,7 318,6 @@ executeio(void)
		unlockpage(out);
		putpage(out);
	}

	ioptr = 0;
}