| plan 9 kernel history: overview | file list | diff list |
1992/0303/port/swap.c (diff list | history)
| 1992/0302/sys/src/9/port/swap.c:15,23 – 1992/0303/sys/src/9/port/swap.c:15,25 (short | long | prev | next) | ||
| 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 | |