| plan 9 kernel history: overview | file list | diff list |
1992/0805/port/swap.c (diff list | history)
| 1992/0804/sys/src/9/port/swap.c:21,27 – 1992/0805/sys/src/9/port/swap.c:21,27 (short | long | prev | next) | ||
| 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 | |