## diffname port/swap.c 1991/0705 ## diff -e /dev/null /n/bootesdump/1991/0705/sys/src/9/port/swap.c 0a #include "u.h" #include "lib.h" #include "mem.h" #include "dat.h" #include "fns.h" #include "ureg.h" #include "errno.h" /* Predeclaration */ void pageout(Proc *p, Segment*); int pagepte(int, Segment*, Page**); void openswap(void); int needpages(void*); void pager(void*); void executeio(void); int canflush(Proc *p, Segment*); enum { Maxpages = 500, /* Max number of pageouts per process pass */ }; Image swapimage; static int swopen; Page *iolist[Maxpages]; int ioptr; void swapinit(void) { swapalloc.swmap = ialloc(conf.nswap, 0); swapalloc.top = &swapalloc.swmap[conf.nswap]; swapalloc.alloc = swapalloc.swmap; swapalloc.free = conf.nswap; } ulong 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; *look = 1; unlock(&swapalloc); return (look-swapalloc.swmap) * BY2PG; } void putswap(Page *p) { lock(&swapalloc); if(--swapalloc.swmap[((ulong)p)/BY2PG] == 0) swapalloc.free++; unlock(&swapalloc); } void dupswap(Page *p) { lock(&swapalloc); swapalloc.swmap[((ulong)p)/BY2PG]++; unlock(&swapalloc); } void kickpager(void) { static int started; if(started) wakeup(&swapalloc.r); else { kproc("pager", pager, 0); started = 1; } } void pager(void *junk) { Proc *p, *ep; Segment *s; int i; p = proctab(0); ep = &p[conf.nproc]; for(;;) { if(waserror()) panic("pager: os error\n"); for(p = proctab(0); p < ep; p++) { if(p->state == Dead || p->kp) continue; sleep(&swapalloc.r, needpages, 0); if(swapimage.c) { for(i = 0; i < NSEG; i++) if(s = p->seg[i]) { pageout(p, s); executeio(); } } 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); } } poperror(); } } void pageout(Proc *p, Segment *s) { Pte **sm, **endsm; Page **pg, **epg; int type; if(!canqlock(&s->lk)) /* We cannot afford to wait, we will surely deadlock */ return; if(!canflush(p, s) || s->steal) { qunlock(&s->lk); putseg(s); return; } if(waserror()) { qunlock(&s->lk); putseg(s); return; } /* 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; } } poperror(); qunlock(&s->lk); putseg(s); wakeup(&palloc.r); } int canflush(Proc *p, Segment *s) { Proc *ep; int i; lock(s); if(s->ref == 1) { /* Easy if we are the only user */ s->ref++; unlock(s); return canpage(p); } s->ref++; unlock(s); /* Now we must do hardwork to ensure all processes which have tlb * entries for this segment are flushed */ p = proctab(0); ep = &p[conf.nproc]; for(; p < ep; p++) if(p->state != Dead) for(i = 0; i < NSEG; i++) if(p->seg[i] == s) if(!canpage(p)) return 0; return 1; } int pagepte(int type, Segment *s, Page **pg) { ulong daddr; char *kaddr; int n; Chan *c; Page *outp; KMap *k; outp = *pg; switch(type) { case SG_TEXT: /* Revert to demand load */ putpage(outp); *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: lockpage(outp); outp->ref++; uncachepage(outp); unlockpage(outp); 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. */ cachepage(outp, &swapimage); *pg = (Page*)(daddr|PG_ONSWAP); /* Add me to IO transaction list */ iolist[ioptr++] = outp; } return 1; } void executeio(void) { Page *out; int i, n; Chan *c; char *kaddr; KMap *k; c = swapimage.c; for(i = 0; i < ioptr; i++) { out = iolist[i]; if(out->ref > 2) { lockpage(out); if(out->ref > 2) { /* Page was reclaimed, abort io */ out->ref -= 2; unlockpage(out); continue; } unlockpage(out); } k = kmap(out); 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"); n = (*devtab[c->type].write)(c, kaddr, BY2PG, out->daddr); if(n != BY2PG) nexterror(); qunlock(&c->wrl); kunmap(k); poperror(); /* Free up the page after I/O */ lockpage(out); out->ref--; unlockpage(out); putpage(out); } ioptr = 0; } int needpages(void *p) { return palloc.freecount < HIGHWATER+MAXHEADROOM; } void setswapchan(Chan *c) { if(swapimage.c) { if(swapalloc.free != conf.nswap) errors("swap channel busy"); close(swapimage.c); } incref(c); swapimage.c = c; } . ## diffname port/swap.c 1991/0706 ## diff -e /n/bootesdump/1991/0705/sys/src/9/port/swap.c /n/bootesdump/1991/0706/sys/src/9/port/swap.c 199c * entries for this segment will be flushed if we suceed in pageing it out . 20c Maxpages = 500, /* Max number of pageouts per segment pass */ . 12d ## diffname port/swap.c 1991/0720 ## diff -e /n/bootesdump/1991/0706/sys/src/9/port/swap.c /n/bootesdump/1991/0720/sys/src/9/port/swap.c 127d ## diffname port/swap.c 1991/0726 ## diff -e /n/bootesdump/1991/0720/sys/src/9/port/swap.c /n/bootesdump/1991/0726/sys/src/9/port/swap.c 116a if(p->state == Dead || p->kp) continue; . ## diffname port/swap.c 1991/0727 ## diff -e /n/bootesdump/1991/0726/sys/src/9/port/swap.c /n/bootesdump/1991/0727/sys/src/9/port/swap.c 126c else if(palloc.freecount < HIGHWATER) { . ## diffname port/swap.c 1991/0926 ## diff -e /n/bootesdump/1991/0727/sys/src/9/port/swap.c /n/bootesdump/1991/0926/sys/src/9/port/swap.c 115a u->p->psstate = "Pageout"; . 114a u->p->psstate = "Idle"; . ## diffname port/swap.c 1991/0928 ## diff -e /n/bootesdump/1991/0926/sys/src/9/port/swap.c /n/bootesdump/1991/0928/sys/src/9/port/swap.c 63a swapalloc.free--; . ## diffname port/swap.c 1991/1115 ## diff -e /n/bootesdump/1991/0928/sys/src/9/port/swap.c /n/bootesdump/1991/1115/sys/src/9/port/swap.c 322a USED(p); . 105a USED(junk); . ## diffname port/swap.c 1992/0111 ## diff -e /n/bootesdump/1991/1115/sys/src/9/port/swap.c /n/bootesdump/1992/0111/sys/src/9/port/swap.c 7c #include "../port/error.h" . ## diffname port/swap.c 1992/0114 ## diff -e /n/bootesdump/1992/0111/sys/src/9/port/swap.c /n/bootesdump/1992/0114/sys/src/9/port/swap.c 333c error(Einuse); . ## diffname port/swap.c 1992/0120 ## diff -e /n/bootesdump/1992/0114/sys/src/9/port/swap.c /n/bootesdump/1992/0120/sys/src/9/port/swap.c 6d ## diffname port/swap.c 1992/0130 ## diff -e /n/bootesdump/1992/0120/sys/src/9/port/swap.c /n/bootesdump/1992/0130/sys/src/9/port/swap.c 130a /* Rob made me do it ! */ if(conf.cntrlp == 0) freebroken(); . ## diffname port/swap.c 1992/0301 ## diff -e /n/bootesdump/1992/0130/sys/src/9/port/swap.c /n/bootesdump/1992/0301/sys/src/9/port/swap.c 295a #endif . 289c if(out->ref > 2) { . 286a #ifdef asdf . 238,248d 116,121d 111a u->p->psstate = "Idle"; sleep(&swapalloc.r, needpages, 0); u->p->psstate = "Pageout"; . 18c Maxpages = 300, /* Max number of pageouts per segment pass */ . ## diffname port/swap.c 1992/0302 ## diff -e /n/bootesdump/1992/0301/sys/src/9/port/swap.c /n/bootesdump/1992/0302/sys/src/9/port/swap.c 289,291d 255a scavenge++; . 234a . 233a scavenge++; . 229c print("outp: %lux\n", *pg); . 214a } p++; } . 209,210c while(p < ep) { if(p->state != Dead) { . 185d 181a if(ioptr >= Maxpages) goto out; } } out: print("%s: %d: type %s %d pages\n", p->text, p->pid, sname[type], scavenge); . 169,180c 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); . 165a scavenge = 0; . 149a extern char *sname[]; . 147,148c Pte **sm, **endsm, *l; Page **pg, *entry; . 24a int scavenge; . 18c Maxpages = 100, /* Max number of pageouts per segment pass */ . ## diffname port/swap.c 1992/0303 ## diff -e /n/bootesdump/1992/0302/sys/src/9/port/swap.c /n/bootesdump/1992/0303/sys/src/9/port/swap.c 333c return palloc.freecount < swapalloc.headroom; . 293,303c . 245d 242d 238,240d 193,194c DBG("%s: %d: %5s s %d nr %d fr %d\n", p->text, p->pid, sname[type], scavenge, nr, palloc.freecount); . 184d 181,182c if(entry->modref & PG_REF) . 177a nr++; . 168a nr = 0; . 161a if(!canflush(p, s)) { qunlock(&s->lk); putseg(s); return; } . 156c if(s->steal) { . 152a . 150c int type, nr; . 142a goto loop; . 141c /* Emulate the old system if no swap channel */ print("no physical memory\n"); tsleep(&swapalloc.r, return0, 0, 1000); wakeup(&palloc.r); } . 139a else if(palloc.freecount < swapalloc.highwater) { /* Rob made me do it ! */ if(conf.cntrlp == 0) freebroken(); . 134,137c if(swapimage.c) { for(i = 0; i < NSEG; i++) { if(!needpages(junk)) goto loop; if(s = p->seg[i]) { pageout(p, s); executeio(); } . 121,132c if(p->state == Dead || p->kp) continue; . 117,119c for(;;) { p++; if(p > ep) p = proctab(0); . 113,115c loop: u->p->psstate = "Idle"; sleep(&swapalloc.r, needpages, 0); u->p->psstate = "Pageout"; . 109,111d 105a if(waserror()) panic("pager: os error\n"); . 20a #define DBG if(1)print . 18c Maxpages = 500, /* Max number of pageouts per segment pass */ . ## diffname port/swap.c 1992/0304 ## diff -e /n/bootesdump/1992/0303/sys/src/9/port/swap.c /n/bootesdump/1992/0304/sys/src/9/port/swap.c 327d 288,289d 286d 262d 251c void . 209,211d 194d 183,185d 171c if(!canflush(p, s)) { /* Able to invalidate all tlbs with references */ . 165c if(s->steal) { /* Protected by /dev/proc */ . 161d 158,159c int type; . 133,134c 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(); } . 106c int i, type; . 27d 21,22d 10c void pagepte(int, Segment*, Page**); . ## diffname port/swap.c 1992/0307 ## diff -e /n/bootesdump/1992/0304/sys/src/9/port/swap.c /n/bootesdump/1992/0307/sys/src/9/port/swap.c 265a case SG_SHDATA: . ## diffname port/swap.c 1992/0321 ## diff -e /n/bootesdump/1992/0307/sys/src/9/port/swap.c /n/bootesdump/1992/0321/sys/src/9/port/swap.c 2c #include "../port/lib.h" . ## diffname port/swap.c 1992/0619 ## diff -e /n/bootesdump/1992/0321/sys/src/9/port/swap.c /n/bootesdump/1992/0619/sys/src/9/port/swap.c 29c swapalloc.swmap = xalloc(conf.nswap); . ## diffname port/swap.c 1992/0625 ## diff -e /n/bootesdump/1992/0619/sys/src/9/port/swap.c /n/bootesdump/1992/0625/sys/src/9/port/swap.c 319c unlock(out); . 317c lock(out); . 270c unlock(outp); . 267c lock(outp); . ## diffname port/swap.c 1992/0628 ## diff -e /n/bootesdump/1992/0625/sys/src/9/port/swap.c /n/bootesdump/1992/0628/sys/src/9/port/swap.c 278a outp->daddr = daddr; . 272,274d 266a daddr = newswap(); . 128a . 119c if(p >= ep) . 46,60c look = memchr(swapalloc.swmap, 0, conf.nswap); if(look == 0) panic("inconsistant swap"); . 40d ## diffname port/swap.c 1992/0629 ## diff -e /n/bootesdump/1992/0628/sys/src/9/port/swap.c /n/bootesdump/1992/0629/sys/src/9/port/swap.c 256c cachedel(&swapimage, daddr); . ## diffname port/swap.c 1992/0711 ## diff -e /n/bootesdump/1992/0629/sys/src/9/port/swap.c /n/bootesdump/1992/0711/sys/src/9/port/swap.c 238c pagepte(int type, Page **pg) . 191c pagepte(type, pg); . 10c void pagepte(int, Page**); . ## diffname port/swap.c 1992/0725 ## diff -e /n/bootesdump/1992/0711/sys/src/9/port/swap.c /n/bootesdump/1992/0725/sys/src/9/port/swap.c 135,137c if(!cpuserver) freebroken(); /* can use the memory */ . ## diffname port/swap.c 1992/0804 ## diff -e /n/bootesdump/1992/0725/sys/src/9/port/swap.c /n/bootesdump/1992/0804/sys/src/9/port/swap.c 271a npage++; . 143a if(npage == 0) print("swap: pass took no pages\n"); . 103a npage = 0; . 24c int ioptr, npage; . ## diffname port/swap.c 1992/0805 ## diff -e /n/bootesdump/1992/0804/sys/src/9/port/swap.c /n/bootesdump/1992/0805/sys/src/9/port/swap.c 275d 235d 210a Proc *ep; . 209d 194a pagepte(type, pg); . 192,193c continue; } . 190c if(entry->modref & PG_REF) { . 180,182c for(i = 0; i < SEGMAPSIZE; i++) { l = s->map[i]; . 155d 153c int type, i; Pte *l; . 145,146d 134c . 132a continue; . 129c if(ioptr != 0) { u->p->psstate = "I/O"; executeio(); } . 127a u->p->psstate = "Pageout"; . 123a pageout(p, s); break; . 119,120c switch(s->type&SG_TYPE) { . 104d 102d 90c int i; . 24c int ioptr; . ## diffname port/swap.c 1992/0825 ## diff -e /n/bootesdump/1992/0805/sys/src/9/port/swap.c /n/bootesdump/1992/0825/sys/src/9/port/swap.c 335d 304d 295d ## diffname port/swap.c 1992/0905 ## diff -e /n/bootesdump/1992/0825/sys/src/9/port/swap.c /n/bootesdump/1992/0905/sys/src/9/port/swap.c 18c Maxpages = 500, /* Max number of pageouts per segment pass */ . ## diffname port/swap.c 1992/0910 ## diff -e /n/bootesdump/1992/0905/sys/src/9/port/swap.c /n/bootesdump/1992/0910/sys/src/9/port/swap.c 164d 21,24c Image swapimage; static int swopen; static Page *iolist[Maxpages]; static int ioptr; . 13,14d 11d 8c int canflush(Proc *p, Segment*); void executeio(void); int needpages(void*); . ## diffname port/swap.c 1992/0912 ## diff -e /n/bootesdump/1992/0910/sys/src/9/port/swap.c /n/bootesdump/1992/0912/sys/src/9/port/swap.c 59a if(idx < swapalloc.last) swapalloc.last = idx; . 58c idx = &swapalloc.swmap[((ulong)p)/BY2PG]; if(--(*idx) == 0) . 56a uchar *idx; . 48a swapalloc.last = look; . 46,47c panic("inconsistent swap"); . 44c look = memchr(swapalloc.last, 0, swapalloc.top-swapalloc.last); . 38c uchar *look; . 31c swapalloc.last = swapalloc.swmap; . ## diffname port/swap.c 1992/0913 ## diff -e /n/bootesdump/1992/0912/sys/src/9/port/swap.c /n/bootesdump/1992/0913/sys/src/9/port/swap.c 296d 64,65c if(idx < swapalloc.last) swapalloc.last = idx; } . 62c if(--(*idx) == 0) { . ## diffname port/swap.c 1992/1209 ## diff -e /n/bootesdump/1992/0913/sys/src/9/port/swap.c /n/bootesdump/1992/1209/sys/src/9/port/swap.c 17c Maxpages = SEGMAXSIZE/BY2PG, /* Max # of pageouts per segment pass */ . ## diffname port/swap.c 1993/0103 ## diff -e /n/bootesdump/1992/1209/sys/src/9/port/swap.c /n/bootesdump/1993/0103/sys/src/9/port/swap.c 32a iolist = xalloc(Maxpages*sizeof(Page*)); if(swapalloc.swmap == 0 || iolist == 0) panic("swapinit: not enough memory"); . 22c static Page **iolist; . ## diffname port/swap.c 1993/0501 ## diff -e /n/bootesdump/1993/0103/sys/src/9/port/swap.c /n/fornaxdump/1993/0501/sys/src/brazil/port/swap.c 139c up->psstate = "I/O"; . 136c up->psstate = "Pageout"; . 109c up->psstate = "Idle"; . ## diffname port/swap.c 1993/0910 ## diff -e /n/fornaxdump/1993/0501/sys/src/brazil/port/swap.c /n/fornaxdump/1993/0910/sys/src/brazil/port/swap.c 326c for(i = 0; i < NCOLOR; i++) if(palloc.freecol[i] < swapalloc.headroom/NCOLOR) return 1; return 0; . 324a int i; . 214d 155c for(i = 0; i < NCOLOR; i++) wakeup(&palloc.r[i]); . 147,148c else { . 145d 112c while(needpages(junk)) { . ## diffname port/swap.c 1993/1008 ## diff -e /n/fornaxdump/1993/0910/sys/src/brazil/port/swap.c /n/fornaxdump/1993/1008/sys/src/brazil/port/swap.c 116a /* don't swap out programs from devroot.c */ if(devchar[p->seg[SG_TEXT]->image->c->type] == '/') continue; . ## diffname port/swap.c 1993/1011 ## diff -e /n/fornaxdump/1993/1008/sys/src/brazil/port/swap.c /n/fornaxdump/1993/1011/sys/src/brazil/port/swap.c 118c img = p->seg[SG_TEXT]->image; if(img && devchar[img->c->type] == '/') . 99a Image *img; Segment *s; Proc *p, *ep; . 97,98d ## diffname port/swap.c 1993/1105 ## diff -e /n/fornaxdump/1993/1011/sys/src/brazil/port/swap.c /n/fornaxdump/1993/1105/sys/src/brazil/port/swap.c 121,123d 117a if(p->state == Dead || p->kp) continue; . ## diffname port/swap.c 1993/1120 ## diff -e /n/fornaxdump/1993/1105/sys/src/brazil/port/swap.c /n/fornaxdump/1993/1120/sys/src/brazil/port/swap.c 332,335c return palloc.freecount < swapalloc.headroom; . 329,330d 158,160c tsleep(&swapalloc.r, return0, 0, 5000); wakeup(&palloc.r); . 121c /* don't swap out programs from devroot.c - they * supply important system services */ . ## diffname port/swap.c 1993/1123 ## diff -e /n/fornaxdump/1993/1120/sys/src/brazil/port/swap.c /n/fornaxdump/1993/1123/sys/src/brazil/port/swap.c 156a else killbig(); . ## diffname port/swap.c 1994/0509 ## diff -e /n/fornaxdump/1993/1123/sys/src/brazil/port/swap.c /n/fornaxdump/1994/0509/sys/src/brazil/port/swap.c 264c case SG_TEXT: /* Revert to demand load */ . ## diffname port/swap.c 1994/0817 ## diff -e /n/fornaxdump/1994/0509/sys/src/brazil/port/swap.c /n/fornaxdump/1994/0817/sys/src/brazil/port/swap.c 35a swapimage.notext = 1; . ## diffname port/swap.c 1994/0914 ## diff -e /n/fornaxdump/1994/0817/sys/src/brazil/port/swap.c /n/fornaxdump/1994/0914/sys/src/brazil/port/swap.c 126c img = p->seg[TSEG]->image; . ## diffname port/swap.c 1995/0319 ## diff -e /n/fornaxdump/1994/0914/sys/src/brazil/port/swap.c /n/fornaxdump/1995/0319/sys/src/brazil/port/swap.c 164c tsleep(&swapalloc.pause, return0, 0, 5000); . 123,129d 100d ## diffname port/swap.c 1995/0804 ## diff -e /n/fornaxdump/1995/0319/sys/src/brazil/port/swap.c /n/fornaxdump/1995/0804/sys/src/brazil/port/swap.c 326d 324c needpages(void*) . 106d ## diffname port/swap.c 1995/0815 ## diff -e /n/fornaxdump/1995/0804/sys/src/brazil/port/swap.c /n/fornaxdump/1995/0815/sys/src/brazil/port/swap.c 322c static int . 287c static void . 249c static void . 233c * entries for this segment will be flushed if we succeed in paging it out . 217c static int . 162c static void . 96c static void . 8,13c static int canflush(Proc*, Segment*); static void executeio(void); static int needpages(void*); static void pageout(Proc*, Segment*); static void pagepte(int, Page**); static void pager(void*); . ## diffname port/swap.c 1997/0327 ## diff -e /n/fornaxdump/1995/0815/sys/src/brazil/port/swap.c /n/emeliedump/1997/0327/sys/src/brazil/port/swap.c 334c cclose(swapimage.c); . 306c n = devtab[c->type]->write(c, kaddr, BY2PG, out->daddr); . ## diffname port/swap.c 1997/0516 ## diff -e /n/emeliedump/1997/0327/sys/src/brazil/port/swap.c /n/emeliedump/1997/0516/sys/src/brazil/port/swap.c 136a case SG_MAP: . ## diffname port/swap.c 1998/0403 ## diff -e /n/emeliedump/1997/0516/sys/src/brazil/port/swap.c /n/emeliedump/1998/0403/sys/src/brazil/port/swap.c 337d 334a } . 333c if(swapalloc.free != conf.nswap){ cclose(c); . ## diffname port/swap.c 1998/0512 ## diff -e /n/emeliedump/1998/0403/sys/src/brazil/port/swap.c /n/emeliedump/1998/0512/sys/src/brazil/port/swap.c 247c return 1; . 163c static void . 103c if(waserror()) . 57c return (look-swapalloc.swmap) * BY2PG; . 52c . ## diffname port/swap.c 1998/0916 ## diff -e /n/emeliedump/1998/0512/sys/src/brazil/port/swap.c /n/emeliedump/1998/0916/sys/src/brazil/port/swap.c 208c if(ioptr >= conf.nswppo) . 192c size = s->mapsize; for(i = 0; i < size; i++) { . 166c int type, i, size; . 33c iolist = xalloc(conf.nswppo*sizeof(Page*)); . 15,19d ## diffname port/swap.c 1998/1020 ## diff -e /n/emeliedump/1998/0916/sys/src/brazil/port/swap.c /n/emeliedump/1998/1020/sys/src/brazil/port/swap.c 280a break; . 263a case SG_MAP: . 138a break; . 131a case SG_SHDATA: . ## diffname port/swap.c 1999/0108 ## diff -e /n/emeliedump/1998/1020/sys/src/brazil/port/swap.c /n/emeliedump/1999/0108/sys/src/brazil/port/swap.c 280a unlock(outp); . 272d 266a /* if it's already on disk, we're done */ #ifdef asdf lock(outp); if(outp->daddr != 0 && outp->image == &swapimage){ dupswap((Page*)outp->daddr); *pg = (Page*)(outp->daddr|PG_ONSWAP); unlock(outp); putpage(outp); return; } unlock(outp); #endif asdf . 143a qunlock(&p->seglock); . 119a } . 118c if(!needpages(junk)){ qunlock(&p->seglock); . 116a p++; if(p >= ep) p = proctab(0); if(p->state == Dead || p->kp) continue; qlock(&p->seglock); . 113,115d 109,111d 77a int swapcount(ulong daddr) { return swapalloc.swmap[daddr/BY2PG]; } . 73a if(swapalloc.swmap[((ulong)p)/BY2PG]==255) panic("dupswap"); . 62a if(swapalloc.swmap[((ulong)p)/BY2PG]==255) panic("putswap"); . ## diffname port/swap.c 1999/0109 ## diff -e /n/emeliedump/1999/0108/sys/src/brazil/port/swap.c /n/emeliedump/1999/0109/sys/src/brazil/port/swap.c 310c /* Add page to IO transaction list */ . 304a outp->ref++; /* * enter it into the cache so that a fault happening * during the write will grab the page from the cache */ . 301,303c /* * incr the reference count to make sure it sticks around while * being written . 298c /* forget anything that it used to cache */ . 296a . 294a /* * get a new swap address and clear any pages * referring to it from the cache */ . 285c if(outp->image == &swapimage){ . 282c /* if it's already on disk, no need to do io again */ . 78d 76c if(++swapalloc.swmap[((ulong)p)/BY2PG] == 0) . 68a if(*idx >= 254) panic("putswap %lux == %ud", p, *idx); . 63,64d ## diffname port/swap.c 1999/0110 ## diff -e /n/emeliedump/1999/0109/sys/src/brazil/port/swap.c /n/emeliedump/1999/0110/sys/src/brazil/port/swap.c 356a up->psstate = "I/Oput"; . 353a up->psstate = "I/Odec"; . 345a up->psstate = "I/Owr"; . 339a up->psstate = "I/Okm"; . 338a if(ioptr > conf.nswppo) panic("executeio: ioptr %d > %d\n", ioptr, conf.nswppo); . 326a void pagersummary(void) { print("%lud/%lud memory %lud/%lud swap %d iolist\n", palloc.user-palloc.freecount, palloc.user, conf.nswap-swapalloc.free, conf.nswap, ioptr); } . 314a * rather than one partially written to the disk . 281,293d 127c if(!canqlock(&p->seglock)) continue; /* process changing its segments */ . ## diffname port/swap.c 1999/0112 ## diff -e /n/emeliedump/1999/0110/sys/src/brazil/port/swap.c /n/emeliedump/1999/0112/sys/src/brazil/port/swap.c 361d 357d 348d 341d ## diffname port/swap.c 1999/0115 ## diff -e /n/emeliedump/1999/0112/sys/src/brazil/port/swap.c /n/emeliedump/1999/0115/sys/src/brazil/port/swap.c 378a /* * if this isn't a file, set the swap space * to be at most the size of the partition */ if(devtab[c->type]->dc != L'M'){ devtab[c->type]->stat(c, dirbuf); convM2D(dirbuf, &d); if(d.length < conf.nswap*BY2PG){ conf.nswap = d.length/BY2PG; swapalloc.top = &swapalloc.swmap[conf.nswap]; swapalloc.free = conf.nswap; } } . 371a char dirbuf[DIRLEN]; Dir d; . ## diffname port/swap.c 1999/0120 ## diff -e /n/emeliedump/1999/0115/sys/src/brazil/port/swap.c /n/emeliedump/1999/0120/sys/src/brazil/port/swap.c 397a } int swapfull(void) { return swapalloc.free < conf.nswap/10; . 287a if(daddr == ~0) break; . 43a if(swapalloc.free == 0){ unlock(&swapalloc); return ~0; } . 41,42d ## diffname port/swap.c 2001/0424 ## diff -e /n/emeliedump/1999/0120/sys/src/brazil/port/swap.c /n/emeliedump/2001/0424/sys/src/9/port/swap.c 285d 151d ## diffname port/swap.c 2001/0425 ## diff -e /n/emeliedump/2001/0424/sys/src/9/port/swap.c /n/emeliedump/2001/0425/sys/src/9/port/swap.c 283d 150d ## diffname port/swap.c 2001/0527 ## diff -e /n/emeliedump/2001/0425/sys/src/9/port/swap.c /n/emeliedump/2001/0527/sys/src/9/port/swap.c 389,390c n = devtab[c->type]->stat(c, dirbuf, sizeof dirbuf); if(n <= 0){ cclose(c); error("stat failed in setswapchan"); } convM2D(dirbuf, n, &d, nil); . 374a int n; . 373c uchar dirbuf[sizeof(Dir)+100]; . ## diffname port/swap.c 2002/0502 ## diff -e /n/emeliedump/2001/0527/sys/src/9/port/swap.c /n/emeliedump/2002/0502/sys/src/9/port/swap.c 127c if(p->state == Dead || p->noswap) . ## diffname port/swap.c 2003/0407 ## diff -e /n/emeliedump/2002/0502/sys/src/9/port/swap.c /n/emeliedump/2003/0407/sys/src/9/port/swap.c 170c tsleep(&up->sleep, return0, 0, 5000); .