| plan 9 kernel history: overview | file list | diff list |
1992/0304/port/swap.c (diff list | history)
| 1991/0705/sys/src/9/port/swap.c:9,15 – 1991/0706/sys/src/9/port/swap.c:9,14 (short | long) | ||
| 1991/0705 | /* Predeclaration */ void pageout(Proc *p, Segment*); int pagepte(int, Segment*, Page**); | |
| 1991/0705/sys/src/9/port/swap.c:17,23 – 1991/0706/sys/src/9/port/swap.c:16,22 | ||
| 1991/0705 | enum { | |
| 1991/0706 | Maxpages = 500, /* Max number of pageouts per segment pass */ | |
| 1991/0705 | }; Image swapimage; | |
| 1991/0705/sys/src/9/port/swap.c:196,202 – 1991/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 | |
| 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,130 – 1991/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"); | |
| 1991/0720/sys/src/9/port/swap.c:114,119 – 1991/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,129 – 1991/0727/sys/src/9/port/swap.c:123,130 (short | long) | ||
| 1991/0705 | executeio(); } } | |
| 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,118 – 1991/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,66 – 1991/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,108 – 1991/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,325 – 1991/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,10 – 1992/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" | |
| 1992/0111 | #include "../port/error.h" | |
| 1991/0705 | /* Predeclaration */ void pageout(Proc *p, Segment*); | |
| 1992/0111/sys/src/9/port/swap.c:330,336 – 1992/0114/sys/src/9/port/swap.c:330,336 (short | long) | ||
| 1991/0705 | { if(swapimage.c) { if(swapalloc.free != conf.nswap) | |
| 1992/0114 | error(Einuse); | |
| 1991/0705 | close(swapimage.c); } incref(c); | |
| 1992/0114/sys/src/9/port/swap.c:3,9 – 1992/0120/sys/src/9/port/swap.c:3,8 (short | long) | ||
| 1991/0705 | #include "mem.h" #include "dat.h" #include "fns.h" | |
| 1992/0111 | #include "../port/error.h" | |
| 1991/0705 | /* Predeclaration */ | |
| 1992/0120/sys/src/9/port/swap.c:128,133 – 1992/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,21 – 1992/0301/sys/src/9/port/swap.c:15,21 (short | long) | ||
| 1991/0705 | enum { | |
| 1991/0706 |
| |
| 1992/0301 | Maxpages = 300, /* Max number of pageouts per segment pass */ | |
| 1991/0705 | }; Image swapimage; | |
| 1992/0130/sys/src/9/port/swap.c:109,124 – 1992/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 |
| |
| 1991/0705 |
| |
| 1991/0926 |
| |
| 1991/0705 | ||
| 1991/0726 |
| |
| 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,251 – 1992/0301/sys/src/9/port/swap.c:233,238 | ||
| 1991/0705 | *pg = 0; break; case SG_DATA: | |
| 1992/0130/sys/src/9/port/swap.c:284,292 – 1992/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); | |
| 1992/0301 | if(out->ref > 2) { | |
| 1991/0705 | out->ref -= 2; unlockpage(out); continue; | |
| 1992/0130/sys/src/9/port/swap.c:293,298 – 1992/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,21 – 1992/0302/sys/src/9/port/swap.c:15,21 (short | long) | ||
| 1991/0705 | enum { | |
| 1992/0301 |
| |
| 1992/0302 | Maxpages = 100, /* Max number of pageouts per segment pass */ | |
| 1991/0705 | }; Image swapimage; | |
| 1992/0301/sys/src/9/port/swap.c:22,27 – 1992/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,152 – 1992/0302/sys/src/9/port/swap.c:145,154 | ||
| 1991/0705 | void pageout(Proc *p, Segment *s) { | |
| 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,188 – 1992/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]; | |
| 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); | |
| 1992/0301/sys/src/9/port/swap.c:206,217 – 1992/0302/sys/src/9/port/swap.c:218,233 | ||
| 1991/0705 | */ p = proctab(0); ep = &p[conf.nproc]; | |
| 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,237 – 1992/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,258 – 1992/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,294 – 1992/0302/sys/src/9/port/swap.c:305,310 | ||
| 1991/0705 | kaddr = (char*)VA(k); qlock(&c->wrl); | |
| 1992/0302/sys/src/9/port/swap.c:15,23 – 1992/0303/sys/src/9/port/swap.c:15,25 (short | long) | ||
| 1991/0705 | enum { | |
| 1992/0302 |
| |
| 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,145 – 1992/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]; | |
| 1992/0301 |
| |
| 1992/0303 | loop: u->p->psstate = "Idle"; sleep(&swapalloc.r, needpages, 0); u->p->psstate = "Pageout"; | |
| 1992/0301 | ||
| 1991/0705 |
| |
| 1992/0303 | for(;;) { p++; if(p > ep) p = proctab(0); | |
| 1991/0705 |
| |
| 1991/0727 |
| |
| 1992/0130 |
| |
| 1992/0303 | if(p->state == Dead || p->kp) continue; | |
| 1992/0130 | ||
| 1991/0705 |
| |
| 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 |
| |
| 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,164 – 1992/0303/sys/src/9/port/swap.c:155,179 | ||
| 1991/0705 | { | |
| 1992/0302 | Pte **sm, **endsm, *l; Page **pg, *entry; | |
| 1991/0705 |
| |
| 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; | |
| 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,171 – 1992/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,187 – 1992/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; | |
| 1992/0303 | if(entry->modref & PG_REF) | |
| 1992/0302 | entry->modref &= ~PG_REF; | |
| 1991/0705 | ||
| 1992/0302/sys/src/9/port/swap.c:190,197 – 1992/0303/sys/src/9/port/swap.c:206,214 | ||
| 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/0302/sys/src/9/port/swap.c:235,248 – 1992/0303/sys/src/9/port/swap.c:252,260 | ||
| 1991/0705 | pagepte(int type, Segment *s, Page **pg) { ulong daddr; | |
| 1992/0302 |
| |
| 1991/0705 | switch(type) { case SG_TEXT: /* Revert to demand load */ putpage(outp); | |
| 1992/0302/sys/src/9/port/swap.c:290,306 – 1992/0303/sys/src/9/port/swap.c:302,308 | ||
| 1991/0705 | for(i = 0; i < ioptr; i++) { out = iolist[i]; | |
| 1992/0301 |
| |
| 1991/0705 |
| |
| 1992/0301 |
| |
| 1991/0705 |
| |
| 1992/0301 |
| |
| 1992/0303 | ||
| 1991/0705 | k = kmap(out); kaddr = (char*)VA(k); qlock(&c->wrl); | |
| 1992/0302/sys/src/9/port/swap.c:330,336 – 1992/0303/sys/src/9/port/swap.c:332,338 | ||
| 1991/0705 | needpages(void *p) { | |
| 1991/1115 | USED(p); | |
| 1991/0705 |
| |
| 1992/0303 | return palloc.freecount < swapalloc.headroom; | |
| 1991/0705 | } void | |
| 1992/0303/sys/src/9/port/swap.c:7,13 – 1992/0304/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**); | |
| 1991/0705 | int needpages(void*); void pager(void*); void executeio(void); | |
| 1992/0303/sys/src/9/port/swap.c:18,30 – 1992/0304/sys/src/9/port/swap.c:18,27 | ||
| 1992/0303 | Maxpages = 500, /* Max number of pageouts per segment pass */ | |
| 1991/0705 | }; | |
| 1992/0303 |
| |
| 1991/0705 | Image swapimage; static int swopen; Page *iolist[Maxpages]; int ioptr; | |
| 1992/0302 |
| |
| 1991/0705 | void swapinit(void) | |
| 1992/0303/sys/src/9/port/swap.c:103,109 – 1992/0304/sys/src/9/port/swap.c:100,106 | ||
| 1991/0705 | { Proc *p, *ep; Segment *s; | |
| 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,137 – 1992/0304/sys/src/9/port/swap.c:127,144 | ||
| 1992/0303 | if(!needpages(junk)) goto loop; if(s = p->seg[i]) { | |
| 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,174 – 1992/0304/sys/src/9/port/swap.c:162,179 | ||
| 1991/0705 | { | |
| 1992/0302 | Pte **sm, **endsm, *l; Page **pg, *entry; | |
| 1992/0303 |
| |
| 1992/0302 |
| |
| 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 |
| |
| 1992/0304 | if(s->steal) { /* Protected by /dev/proc */ | |
| 1991/0705 | qunlock(&s->lk); putseg(s); return; } | |
| 1992/0303 |
| |
| 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,188 – 1992/0304/sys/src/9/port/swap.c:185,190 | ||
| 1991/0705 | return; } | |
| 1992/0302 |
| |
| 1992/0303 |
| |
| 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,197 – 1992/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 |
| |
| 1992/0302 | entry = *pg; if(pagedout(entry)) continue; | |
| 1992/0303/sys/src/9/port/swap.c:206,214 – 1992/0304/sys/src/9/port/swap.c:207,212 | ||
| 1992/0302 | } } out: | |
| 1992/0303 |
| |
| 1991/0705 | poperror(); qunlock(&s->lk); putseg(s); | |
| 1992/0303/sys/src/9/port/swap.c:248,254 – 1992/0304/sys/src/9/port/swap.c:246,252 | ||
| 1991/0705 | return 1; } | |
| 1992/0304 | void | |
| 1991/0705 | pagepte(int type, Segment *s, Page **pg) { ulong daddr; | |
| 1992/0303/sys/src/9/port/swap.c:259,265 – 1992/0304/sys/src/9/port/swap.c:257,262 | ||
| 1991/0705 | case SG_TEXT: /* Revert to demand load */ putpage(outp); *pg = 0; | |
| 1992/0302 |
| |
| 1991/0705 | break; | |
| 1992/0302 | ||
| 1991/0705 | case SG_DATA: | |
| 1992/0303/sys/src/9/port/swap.c:283,292 – 1992/0304/sys/src/9/port/swap.c:280,286 | ||
| 1991/0705 | /* Add me to IO transaction list */ iolist[ioptr++] = outp; | |
| 1992/0302 |
| |
| 1991/0705 | } | |
| 1992/0303/sys/src/9/port/swap.c:324,330 – 1992/0304/sys/src/9/port/swap.c:318,323 | ||
| 1991/0705 | unlockpage(out); putpage(out); } | |
| 1992/0304/sys/src/9/port/swap.c:263,268 – 1992/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,5 – 1992/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" | |
| 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,32 – 1992/0619/sys/src/9/port/swap.c:26,32 (short | long) | ||
| 1991/0705 | void swapinit(void) { | |
| 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,273 – 1992/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 |
| |
| 1992/0625 | lock(outp); | |
| 1991/0705 | outp->ref++; uncachepage(outp); | |
| 1992/0625 | unlock(outp); | |
| 1991/0705 | daddr = newswap(); outp->daddr = daddr; | |
| 1992/0619/sys/src/9/port/swap.c:314,322 – 1992/0625/sys/src/9/port/swap.c:314,322 | ||
| 1991/0705 | poperror(); /* Free up the page after I/O */ | |
| 1992/0625 | lock(out); | |
| 1991/0705 | out->ref--; | |
| 1992/0625 | unlock(out); | |
| 1991/0705 | putpage(out); } ioptr = 0; | |
| 1992/0625/sys/src/9/port/swap.c:37,63 – 1992/0628/sys/src/9/port/swap.c:37,50 (short | long) | ||
| 1991/0705 | newswap(void) { char *look; | |
| 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,122 – 1992/0628/sys/src/9/port/swap.c:103,109 | ||
| 1992/0301 | ||
| 1992/0303 | for(;;) { p++; | |
| 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,131 – 1992/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,281 – 1992/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 |
| |
| 1992/0628 | outp->daddr = daddr; | |
| 1991/0705 | cachepage(outp, &swapimage); *pg = (Page*)(daddr|PG_ONSWAP); | |
| 1992/0628/sys/src/9/port/swap.c:253,259 – 1992/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,13 – 1992/0711/sys/src/9/port/swap.c:7,13 (short | long) | ||
| 1991/0705 | /* Predeclaration */ void pageout(Proc *p, Segment*); | |
| 1992/0304 |
| |
| 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,194 – 1992/0711/sys/src/9/port/swap.c:188,194 | ||
| 1992/0303 | if(entry->modref & PG_REF) | |
| 1992/0302 | entry->modref &= ~PG_REF; else | |
| 1992/0711 | pagepte(type, pg); | |
| 1991/0705 | ||
| 1992/0302 | if(ioptr >= Maxpages) goto out; | |
| 1992/0629/sys/src/9/port/swap.c:235,241 – 1992/0711/sys/src/9/port/swap.c:235,241 | ||
| 1991/0705 | } | |
| 1992/0304 | void | |
| 1991/0705 |
| |
| 1992/0711 | pagepte(int type, Page **pg) | |
| 1991/0705 | { ulong daddr; Page *outp; | |
| 1992/0711/sys/src/9/port/swap.c:132,140 – 1992/0725/sys/src/9/port/swap.c:132,139 (short | long) | ||
| 1991/0705 | } | |
| 1992/0303 | else if(palloc.freecount < swapalloc.highwater) { | |
| 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,27 – 1992/0804/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; | |
| 1991/0705 | void swapinit(void) | |
| 1992/0725/sys/src/9/port/swap.c:101,106 – 1992/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,146 – 1992/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,274 – 1992/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,27 – 1992/0805/sys/src/9/port/swap.c:21,27 (short | long) | ||
| 1991/0705 | Image swapimage; static int swopen; Page *iolist[Maxpages]; | |
| 1992/0804 |
| |
| 1992/0805 | int ioptr; | |
| 1991/0705 | void swapinit(void) | |
| 1992/0804/sys/src/9/port/swap.c:87,93 – 1992/0805/sys/src/9/port/swap.c:87,93 | ||
| 1991/0705 | { Proc *p, *ep; Segment *s; | |
| 1992/0304 |
| |
| 1992/0805 | int i; | |
| 1991/0705 | ||
| 1992/0303 | if(waserror()) panic("pager: os error\n"); | |
| 1992/0804/sys/src/9/port/swap.c:99,107 – 1992/0805/sys/src/9/port/swap.c:99,105 | ||
| 1992/0303 | loop: u->p->psstate = "Idle"; sleep(&swapalloc.r, needpages, 0); | |
| 1992/0301 | ||
| 1992/0804 |
| |
| 1992/0303 | for(;;) { p++; | |
| 1992/0628 | if(p >= ep) | |
| 1992/0804/sys/src/9/port/swap.c:116,137 – 1992/0805/sys/src/9/port/swap.c:114,141 | ||
| 1992/0303 | goto loop; | |
| 1992/0628 | ||
| 1992/0303 | if(s = p->seg[i]) { | |
| 1992/0304 |
| |
| 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); | |
| 1992/0805 | if(ioptr != 0) { u->p->psstate = "I/O"; executeio(); } | |
| 1992/0304 | } | |
| 1992/0303 | } | |
| 1991/0705 | } | |
| 1992/0805 | continue; | |
| 1991/0705 | } | |
| 1992/0303 |
| |
| 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,149 – 1992/0805/sys/src/9/port/swap.c:146,151 | ||
| 1992/0303 | wakeup(&palloc.r); } | |
| 1991/0705 | } | |
| 1992/0804 |
| |
| 1992/0303 | goto loop; | |
| 1991/0705 | } | |
| 1992/0804/sys/src/9/port/swap.c:150,158 – 1992/0805/sys/src/9/port/swap.c:152,160 | ||
| 1991/0705 | void pageout(Proc *p, Segment *s) { | |
| 1992/0302 |
| |
| 1992/0805 | int type, i; Pte *l; | |
| 1992/0302 | Page **pg, *entry; | |
| 1992/0304 |
| |
| 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,185 – 1992/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; | |
| 1992/0302 |
| |
| 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,197 – 1992/0805/sys/src/9/port/swap.c:188,200 | ||
| 1992/0302 | if(pagedout(entry)) continue; | |
| 1992/0303 |
| |
| 1992/0805 | if(entry->modref & PG_REF) { | |
| 1992/0302 | entry->modref &= ~PG_REF; | |
| 1992/0711 |
| |
| 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,213 – 1992/0805/sys/src/9/port/swap.c:209,216 | ||
| 1991/0705 | int canflush(Proc *p, Segment *s) { | |
| 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,238 – 1992/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,278 – 1992/0805/sys/src/9/port/swap.c:274,279 | ||
| 1991/0705 | /* Add me to IO transaction list */ iolist[ioptr++] = outp; } | |
| 1992/0804 |
| |
| 1991/0705 | } void | |
| Too many diffs (26 > 25). Stopping. | ||