From dc5712090fb4c76d322a7e645b44d366b676ed4f Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Wed, 4 Mar 1992 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1992-03-04 --- port/devarp.c | 3 ++- port/deviproute.c | 2 +- port/fault.c | 2 -- port/ipdat.h | 1 + port/page.c | 6 ------ port/stip.c | 2 +- port/swap.c | 43 ++++++++++++++++++------------------------- 7 files changed, 23 insertions(+), 36 deletions(-) diff --git a/port/devarp.c b/port/devarp.c index 2a915e654ee27be039a02bb5079ff0a5642346cf..dbc3e4ea3cc0a7f7db678826849237eaf1648514 100644 --- a/port/devarp.c +++ b/port/devarp.c @@ -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; diff --git a/port/deviproute.c b/port/deviproute.c index 9dd089e66cbb08df682fc04bf46bba85c2c6111c..72c21a577f692c9608ebc9eec9b94cc81b598626 100644 --- a/port/deviproute.c +++ b/port/deviproute.c @@ -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; } diff --git a/port/fault.c b/port/fault.c index e703a01fd82e25e81968b109820085b73bf1186b..32399d2a04001a55b9b95dadc75c262d201dcdb7 100644 --- a/port/fault.c +++ b/port/fault.c @@ -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); diff --git a/port/ipdat.h b/port/ipdat.h index f296106100b825f28ff0d3271f58bd661f34af7e..ab2565eda8f85596bb0127cd7bb1902b71013c6f 100644 --- a/port/ipdat.h +++ b/port/ipdat.h @@ -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[]; diff --git a/port/page.c b/port/page.c index 33a65191386bc66b3cc4677e44894d38f9338fe4..fadebba1b99159b1b694aeffea1887c8a4132bb6 100644 --- a/port/page.c +++ b/port/page.c @@ -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 diff --git a/port/stip.c b/port/stip.c index 7c77a4f1d2dc00bed3f78f48953bff0fa137ab71..1808134a9557091ce7528d159af1008eb58c8c5e 100644 --- a/port/stip.c +++ b/port/stip.c @@ -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; } diff --git a/port/swap.c b/port/swap.c index 6deb4fc2c4f6c3d7d02b2e967a86be79e2021092..ebf644323357c50d52234e8c814948050aeaeede 100644 --- a/port/swap.c +++ b/port/swap.c @@ -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; }