| plan 9 kernel history: overview | file list | diff list |
1990/1115/port/page.c (diff list | history)
| 1990/0227/sys/src/9/port/page.c:77,93 – 1990/0303/sys/src/9/port/page.c:77,94 (short | long) | ||
| 1990/0227 | { int nf, nb; Page *p; | |
| 1990/0303 | static int here; | |
| 1990/0227 |
| |
| 1990/0303 | do;while(here); here=1; | |
| 1990/0227 | p = palloc.head; nf=nb=0; while(p){ | |
| 1990/0303 | print("%lux %lux %d\n", p->pa, p->va, p->ref); if(p->o){ print("\t%d %lux %c\n", p->o->nproc, p->o->qid, devchar[p->o->type]); delay(100); /* let it drain; there's a lot here */ } | |
| 1990/0227 | nf++; p = p->next; } | |
| 1990/0227/sys/src/9/port/page.c:98,104 – 1990/0303/sys/src/9/port/page.c:99,105 | ||
| 1990/0227 | } print("%s: nf: %d nb: %d\n", s, nf, nb); delay(1000); | |
| 1990/0303 | here=0; | |
| 1990/0227 | } void | |
| 1990/0227/sys/src/9/port/page.c:187,193 – 1990/0303/sys/src/9/port/page.c:188,193 | ||
| 1990/0227 | } #endif } | |
| 1990/0227/sys/src/9/port/page.c:257,263 – 1990/0303/sys/src/9/port/page.c:257,263 | ||
| 1990/0227 | lock(o); if(o->npage && o->qid==c->qid) if(o->va==va && o->npte==npte && o->flag==flag) | |
| 1990/0303 | if(o->mchan==c->mchan && o->mqid==c->mqid && o->type==c->type){ | |
| 1990/0227 | if(o->chan == 0){ o->chan = c; incref(c); | |
| 1990/0227/sys/src/9/port/page.c:289,301 – 1990/0303/sys/src/9/port/page.c:289,303 | ||
| 1990/0227 | o->chan = c; if(c){ o->type = c->type; | |
| 1990/0303 | o->mchan = c->mchan; o->mqid = c->mqid; | |
| 1990/0227 | incref(c); }else{ o->type = -1; | |
| 1990/0303 | o->mqid = -1; o->mchan = 0; | |
| 1990/0227 | } growpte(o, npte); unlock(&origalloc); | |
| 1990/0303/sys/src/9/port/page.c:287,292 – 1990/0312/sys/src/9/port/page.c:287,293 (short | long) | ||
| 1990/0227 | o->nproc = 1; o->npage = 0; o->chan = c; | |
| 1990/0312 | o->nmod = 0; | |
| 1990/0227 | if(c){ o->type = c->type; o->qid = c->qid; | |
| 1990/0303/sys/src/9/port/page.c:350,355 – 1990/0312/sys/src/9/port/page.c:351,358 | ||
| 1990/0227 | } unlock(&modalloc); print("no mods\n"); | |
| 1990/0312 | DEBUG(); panic("mods"); | |
| 1990/0227 | if(u == 0) panic("newmod"); u->p->state = Wakeme; | |
| 1990/0303/sys/src/9/port/page.c:376,381 – 1990/0312/sys/src/9/port/page.c:379,385 | ||
| 1990/0227 | if(pte->page==0) panic("forkmod zero page"); if(pte->proc != u->p) panic("forkmod wrong page"); npte = newmod(); | |
| 1990/0312 | o->nmod++; | |
| 1990/0227 | npte->proc = p; npte->page = pte->page; pte->page->ref++; | |
| 1990/0303/sys/src/9/port/page.c:435,440 – 1990/0312/sys/src/9/port/page.c:439,445 | ||
| 1990/0227 | } pg->ref--; o->npage--; | |
| 1990/0312 | o->nmod--; | |
| 1990/0227 | old = (PTEA*)pte; pte = pte->nextva; lock(&modalloc); | |
| 1990/0312/sys/src/9/port/page.c:189,194 – 1990/0409/sys/src/9/port/page.c:189,195 (short | long) | ||
| 1990/0227 | #endif } print("no physical memory\n"); | |
| 1990/0409 | pprint("no physical memory\n"); | |
| 1990/0227 | unlock(&palloc); if(u == 0) panic("newpage"); | |
| 1990/0409/sys/src/9/port/page.c:10,16 – 1990/0617/sys/src/9/port/page.c:10,16 (short | long) | ||
| 1990/0227 | Lock; ulong addr; int active; | |
| 1990/0617 | Page *page; /* base of Page structures, indexed by phys page number */ | |
| 1990/0227 | ulong minppn; /* index of first usable page */ Page *head; /* most recently used */ Page *tail; /* least recently used */ | |
| 1990/0409/sys/src/9/port/page.c:161,166 – 1990/0617/sys/src/9/port/page.c:161,167 | ||
| 1990/0227 | { Page *p; Orig *o1; | |
| 1990/0617 | KMap *k; | |
| 1990/0227 | if(palloc.active == 0) print("newpage inactive\n"); | |
| 1990/0409/sys/src/9/port/page.c:206,213 – 1990/0617/sys/src/9/port/page.c:207,217 | ||
| 1990/0227 | p->ref = 1; usepage(p, 0); unlock(&palloc); | |
| 1990/0617 | if(!noclear){ k = kmap(p); memset((void*)VA(k), 0, BY2PG); kunmap(k); } | |
| 1990/0227 | p->o = o; p->va = va; | |
| 1990/0617/sys/src/9/port/page.c:493,498 – 1990/0720/sys/src/9/port/page.c:493,499 (short | long) | ||
| 1990/0227 | if(max < min) return 0; | |
| 1990/0720 | if(max > 20*1024*1024) pprint("segaddr %lux\n", max); | |
| 1990/0227 | if(min != s->minva) /* can't grow down yet (stacks: fault.c) */ return 0; max = (max+(BY2PG-1)) & ~(BY2PG-1); | |
| 1990/0720/sys/src/9/port/page.c:560,569 – 1990/0728/sys/src/9/port/page.c:560,574 (short | long) | ||
| 1990/0227 | lock(&ptealloc); lock(o); if(o->pte){ | |
| 1990/0728 | if(o->npte == n){ if(u && u->p) print("%s: ", u->p->text); print("growpte pointless\n"); goto Return; } | |
| 1990/0227 | p = (PTEA*)(o->pte - 1); if(o->npte > n){ | |
| 1990/0728 | print("growpte shrink"); goto Return; | |
| 1990/0227 | nfree = o->npte - n; p->n -= nfree; o->npte -= nfree; | |
| 1990/0720/sys/src/9/port/page.c:589,597 – 1990/0728/sys/src/9/port/page.c:594,600 | ||
| 1990/0227 | p->n = n; o->npte = n-1; } | |
| 1990/0728 | goto Return; | |
| 1990/0227 | } n++; compactpte(o, n); | |
| 1990/0720/sys/src/9/port/page.c:602,607 – 1990/0728/sys/src/9/port/page.c:605,611 | ||
| 1990/0227 | p->o = o; o->pte = p+1; o->npte = n-1; | |
| 1990/0728 | Return: | |
| 1990/0227 | unlock(o); unlock(&ptealloc); } | |
| 1990/0728/sys/src/9/port/page.c:251,256 – 1990/0801/sys/src/9/port/page.c:251,290 (short | long) | ||
| 1990/0227 | unlock(&palloc); } | |
| 1990/0801 | /* * Move page to tail of list */ void unusepage(Page *p, int dolock) { return; if(dolock) lock(&palloc); /* * Unlink */ if(p->prev) p->prev->next = p->next; else palloc.head = p->next; if(p->next) p->next->prev = p->prev; else palloc.tail = p->prev; /* * Link */ p->prev = palloc.tail; p->next = 0; if(p->prev) p->prev->next = p; else palloc.head = p; palloc.tail = p; if(dolock) unlock(&palloc); } | |
| 1990/0227 | Orig* lookorig(ulong va, ulong npte, int flag, Chan *c) { | |
| 1990/0728/sys/src/9/port/page.c:493,499 – 1990/0801/sys/src/9/port/page.c:527,533 | ||
| 1990/0227 | if(max < min) return 0; | |
| 1990/0720 |
| |
| 1990/0801 | if(max > 20*1024*1024) {pprint("segaddr %lux\n", max);print("segaddr %lux\n", max);} | |
| 1990/0227 | if(min != s->minva) /* can't grow down yet (stacks: fault.c) */ return 0; max = (max+(BY2PG-1)) & ~(BY2PG-1); | |
| 1990/0728/sys/src/9/port/page.c:531,536 – 1990/0801/sys/src/9/port/page.c:565,571 | ||
| 1990/0227 | for(i=0; i<o->npte; i++,pte++) if(pg = pte->page){ /* assign = */ if(pg->ref == 1){ | |
| 1990/0801 | unusepage(pg, 1); | |
| 1990/0227 | pte->page = 0; pg->o = 0; } | |
| 1990/0801/sys/src/9/port/page.c:4,9 – 1990/0802/sys/src/9/port/page.c:4,10 (short | long) | ||
| 1990/0227 | #include "dat.h" #include "fns.h" #include "ureg.h" | |
| 1990/0802 | #include "errno.h" | |
| 1990/0227 | struct { | |
| 1990/0801/sys/src/9/port/page.c:257,263 – 1990/0802/sys/src/9/port/page.c:258,263 | ||
| 1990/0801 | void unusepage(Page *p, int dolock) { | |
| 1990/0801/sys/src/9/port/page.c:339,345 – 1990/0802/sys/src/9/port/page.c:339,354 | ||
| 1990/0303 | o->mqid = -1; o->mchan = 0; | |
| 1990/0227 | } | |
| 1990/0802 | lock(o); if(u && u->p && waserror()){ unlock(o); unlock(&origalloc); nexterror(); } | |
| 1990/0227 | growpte(o, npte); | |
| 1990/0802 | if(u && u->p) poperror(); unlock(o); | |
| 1990/0227 | unlock(&origalloc); return o; } | |
| 1990/0801/sys/src/9/port/page.c:527,533 – 1990/0802/sys/src/9/port/page.c:536,541 | ||
| 1990/0227 | if(max < min) return 0; | |
| 1990/0801 |
| |
| 1990/0227 | if(min != s->minva) /* can't grow down yet (stacks: fault.c) */ return 0; max = (max+(BY2PG-1)) & ~(BY2PG-1); | |
| 1990/0801/sys/src/9/port/page.c:539,546 – 1990/0802/sys/src/9/port/page.c:547,561 | ||
| 1990/0227 | * Grow */ /* BUG: check spill onto other segments */ | |
| 1990/0802 | lock(o); if(waserror()){ unlock(o); nexterror(); } | |
| 1990/0227 | if(o->va+BY2PG*o->npte < max) growpte(o, (max-o->va)>>PGSHIFT); | |
| 1990/0802 | unlock(o); poperror(); | |
| 1990/0227 | s->maxva = max; return 1; } | |
| 1990/0801/sys/src/9/port/page.c:593,599 – 1990/0802/sys/src/9/port/page.c:608,613 | ||
| 1990/0227 | ulong nfree; lock(&ptealloc); | |
| 1990/0728 | if(o->npte == n){ if(u && u->p) print("%s: ", u->p->text); | |
| 1990/0801/sys/src/9/port/page.c:613,623 – 1990/0802/sys/src/9/port/page.c:627,639 | ||
| 1990/0227 | }else{ n++; if(p+p->n == ptealloc.free){ | |
| 1990/0802 | if(!compactpte(o, n - p->n)) goto Trouble; | |
| 1990/0227 | p = (PTEA*)(o->pte - 1); ptealloc.free += n - p->n; }else{ | |
| 1990/0802 | if(!compactpte(o, n)) goto Trouble; | |
| 1990/0227 | p = ptealloc.free; ptealloc.free += n; memcpy(p+1, o->pte, o->npte*sizeof(PTE)); | |
| 1990/0801/sys/src/9/port/page.c:632,638 – 1990/0802/sys/src/9/port/page.c:648,655 | ||
| 1990/0728 | goto Return; | |
| 1990/0227 | } n++; | |
| 1990/0802 | if(!compactpte(o, n)) goto Trouble; | |
| 1990/0227 | p = ptealloc.free; ptealloc.free += n; memset(p, 0, n*sizeof(PTE)); | |
| 1990/0801/sys/src/9/port/page.c:641,651 – 1990/0802/sys/src/9/port/page.c:658,674 | ||
| 1990/0227 | o->pte = p+1; o->npte = n-1; | |
| 1990/0728 | Return: | |
| 1990/0227 |
| |
| 1990/0802 | return; Trouble: unlock(&ptealloc); if(u && u->p) error(0, Enovmem); panic("growpte fails %d %lux %d\n", n, o->va, o->npte); | |
| 1990/0227 | } | |
| 1990/0802 | int | |
| 1990/0227 | compactpte(Orig *o, ulong n) { PTEA *p1, *p2; | |
| 1990/0801/sys/src/9/port/page.c:652,658 – 1990/0802/sys/src/9/port/page.c:675,681 | ||
| 1990/0227 | Orig *p2o; if(ptealloc.end-ptealloc.free >= n) | |
| 1990/0802 | return 1; | |
| 1990/0227 | p1 = ptealloc.arena; /* dest */ p2 = ptealloc.arena; /* source */ while(p2 < ptealloc.free){ | |
| 1990/0801/sys/src/9/port/page.c:681,688 – 1990/0802/sys/src/9/port/page.c:704,714 | ||
| 1990/0227 | } ptealloc.free = p1; if(ptealloc.end-ptealloc.free >= n) | |
| 1990/0802 | return 1; | |
| 1990/0227 | unlock(o); unlock(&ptealloc); | |
| 1990/0802 | if(u && u->p) print("%s: %s: ", u->p->text, u->p->pgrp->user); print("compactpte fails addr %lux\n", o->va+n*BY2PG); return 0; | |
| 1990/0227 | } | |
| 1990/0802/sys/src/9/port/page.c:339,347 – 1990/0814/sys/src/9/port/page.c:339,345 (short | long) | ||
| 1990/0303 | o->mqid = -1; o->mchan = 0; | |
| 1990/0227 | } | |
| 1990/0802 |
| |
| 1990/0802/sys/src/9/port/page.c:348,354 – 1990/0814/sys/src/9/port/page.c:346,351 | ||
| 1990/0227 | growpte(o, npte); | |
| 1990/0802 | if(u && u->p) poperror(); | |
| 1990/0227 | unlock(&origalloc); return o; } | |
| 1990/0802/sys/src/9/port/page.c:547,561 – 1990/0814/sys/src/9/port/page.c:544,551 | ||
| 1990/0227 | * Grow */ /* BUG: check spill onto other segments */ | |
| 1990/0802 |
| |
| 1990/0227 | if(o->va+BY2PG*o->npte < max) growpte(o, (max-o->va)>>PGSHIFT); | |
| 1990/0802 |
| |
| 1990/0227 | s->maxva = max; return 1; } | |
| 1990/0802/sys/src/9/port/page.c:601,606 – 1990/0814/sys/src/9/port/page.c:591,600 | ||
| 1990/0227 | p->o = 0; } | |
| 1990/0814 | /* * o is locked. this will always do a grow; if n<=o->npte someone * else got here first and we can just return. */ | |
| 1990/0227 | void growpte(Orig *o, ulong n) { | |
| 1990/0802/sys/src/9/port/page.c:608,650 – 1990/0814/sys/src/9/port/page.c:602,631 | ||
| 1990/0227 | ulong nfree; lock(&ptealloc); | |
| 1990/0814 | lock(o); | |
| 1990/0227 | if(o->pte){ | |
| 1990/0728 |
| |
| 1990/0814 | if(o->npte >= n) | |
| 1990/0728 | goto Return; | |
| 1990/0227 | p = (PTEA*)(o->pte - 1); | |
| 1990/0728 |
| |
| 1990/0227 |
| |
| 1990/0814 | n++; if(p+p->n == ptealloc.free){ if(!compactpte(o, n - p->n)) goto Trouble; p = (PTEA*)(o->pte - 1); ptealloc.free += n - p->n; | |
| 1990/0227 | }else{ | |
| 1990/0802 |
| |
| 1990/0227 |
| |
| 1990/0802 |
| |
| 1990/0227 |
| |
| 1990/0814 | if(!compactpte(o, n)) goto Trouble; p = ptealloc.free; ptealloc.free += n; memcpy(p+1, o->pte, o->npte*sizeof(PTE)); p->o = o; ((PTEA*)(o->pte-1))->o = 0; o->pte = p+1; | |
| 1990/0227 | } | |
| 1990/0814 | memset(p+1+o->npte, 0, (n-(1+o->npte))*sizeof(PTE)); p->n = n; o->npte = n-1; | |
| 1990/0728 | goto Return; | |
| 1990/0227 | } n++; | |
| 1990/0802/sys/src/9/port/page.c:659,668 – 1990/0814/sys/src/9/port/page.c:640,651 | ||
| 1990/0227 | o->npte = n-1; | |
| 1990/0728 | Return: | |
| 1990/0227 | unlock(&ptealloc); | |
| 1990/0814 | unlock(o); | |
| 1990/0802 | return; Trouble: unlock(&ptealloc); | |
| 1990/0814 | unlock(o); | |
| 1990/0802 | if(u && u->p) error(0, Enovmem); panic("growpte fails %d %lux %d\n", n, o->va, o->npte); | |
| 1990/0814/sys/src/9/port/page.c:382,388 – 1990/1013/sys/src/9/port/page.c:382,388 (short | long) | ||
| 1990/0227 | } PTE* | |
| 1990/1013 | newmod(Orig *o) | |
| 1990/0227 | { PTEA *pte; | |
| 1990/0814/sys/src/9/port/page.c:397,403 – 1990/1013/sys/src/9/port/page.c:397,403 | ||
| 1990/0227 | unlock(&modalloc); print("no mods\n"); | |
| 1990/0312 | DEBUG(); | |
| 1990/1013 | panic("mods %lux %d %d", o->va, o->npte, o->nmod); | |
| 1990/0227 | if(u == 0) panic("newmod"); u->p->state = Wakeme; | |
| 1990/0814/sys/src/9/port/page.c:423,429 – 1990/1013/sys/src/9/port/page.c:423,429 | ||
| 1990/0227 | while(pte){ if(pte->page==0) panic("forkmod zero page"); if(pte->proc != u->p) panic("forkmod wrong page"); | |
| 1990/1013 | npte = newmod(o); | |
| 1990/0312 | o->nmod++; | |
| 1990/0227 | npte->proc = p; npte->page = pte->page; | |
| 1990/1013/sys/src/9/port/page.c:463,468 – 1990/1018/sys/src/9/port/page.c:463,469 (short | long) | ||
| 1990/0227 | if(i == save) continue; o = s->o; | |
| 1990/1018 | s->o = 0; /* seg() won't match it (e.g. in procread()) */ | |
| 1990/0227 | if(o == 0) continue; lock(o); | |
| 1990/1018/sys/src/9/port/page.c:190,200 – 1990/1101/sys/src/9/port/page.c:190,202 (short | long) | ||
| 1990/0227 | } #endif } | |
| 1990/0409 |
| |
| 1990/0227 | unlock(&palloc); | |
| 1990/1101 | if(freebroken()) goto loop; | |
| 1990/0227 | if(u == 0) panic("newpage"); | |
| 1990/1101 | print("no physical memory\n"); pprint("no physical memory\n"); | |
| 1990/0227 | u->p->state = Wakeme; alarm(1000, wakeme, u->p); sched(); | |
| 1990/1018/sys/src/9/port/page.c:316,321 – 1990/1101/sys/src/9/port/page.c:318,324 | ||
| 1990/0227 | Orig *o; int i, freed; | |
| 1990/1101 | lockloop: | |
| 1990/0227 | lock(&origalloc); loop: if(o = origalloc.free){ /* assign = */ | |
| 1990/1018/sys/src/9/port/page.c:370,377 – 1990/1101/sys/src/9/port/page.c:373,382 | ||
| 1990/0227 | } if(freed) goto loop; | |
| 1990/1101 | if(freebroken()) goto lockloop; print("no origs freed\n"); | |
| 1990/0227 | if(u == 0) panic("neworig"); u->p->state = Wakeme; | |
| 1990/1101/sys/src/9/port/page.c:559,565 – 1990/1115/sys/src/9/port/page.c:559,565 (short | long) | ||
| 1990/0227 | * Shrink */ print("segaddr shrink"); | |
| 1990/1115 | pexit("Suicide", 0); | |
| 1990/0227 | } /* | |
| 1990/1115/sys/src/9/port/page.c:294,304 – 1990/11211/sys/src/9/port/page.c:294,304 (short | long) | ||
| 1990/0227 | ulong i; for(o=origalloc.arena,i=0; i<conf.norig; i++,o++) | |
| 1990/11211 | if(o->npage && o->qid.path==c->qid.path && o->va==va){ | |
| 1990/0227 | lock(o); | |
| 1990/11211 | if(o->npage && eqqid(o->qid, c->qid)) | |
| 1990/0227 | if(o->va==va && o->npte==npte && o->flag==flag) | |
| 1990/0303 |
| |
| 1990/11211 | if(o->mchan==c->mchan && o->type==c->type && eqqid(o->mqid, c->mqid)){ | |
| 1990/0227 | if(o->chan == 0){ o->chan = c; incref(c); | |
| 1990/1115/sys/src/9/port/page.c:329,335 – 1990/11211/sys/src/9/port/page.c:329,334 | ||
| 1990/0227 | o->nproc = 1; o->npage = 0; o->chan = c; | |
| 1990/0312 |
| |
| 1990/0227 | if(c){ o->type = c->type; o->qid = c->qid; | |
| 1990/1115/sys/src/9/port/page.c:338,345 – 1990/11211/sys/src/9/port/page.c:337,344 | ||
| 1990/0227 | incref(c); }else{ o->type = -1; | |
| 1990/0303 |
| |
| 1990/11211 | o->qid = (Qid){~0, ~0}; o->mqid = (Qid){~0, ~0}; | |
| 1990/0303 | o->mchan = 0; | |
| 1990/0227 | } | |
| 1990/0802 | if(u && u->p && waserror()){ | |
| 1990/1115/sys/src/9/port/page.c:401,408 – 1990/11211/sys/src/9/port/page.c:400,405 | ||
| 1990/0227 | } unlock(&modalloc); print("no mods\n"); | |
| 1990/0312 |
| |
| 1990/1013 |
| |
| 1990/0227 | if(u == 0) panic("newmod"); u->p->state = Wakeme; | |
| 1990/1115/sys/src/9/port/page.c:429,435 – 1990/11211/sys/src/9/port/page.c:426,431 | ||
| 1990/0227 | if(pte->page==0) panic("forkmod zero page"); if(pte->proc != u->p) panic("forkmod wrong page"); | |
| 1990/1013 | npte = newmod(o); | |
| 1990/0312 |
| |
| 1990/0227 | npte->proc = p; npte->page = pte->page; pte->page->ref++; | |
| 1990/1115/sys/src/9/port/page.c:490,496 – 1990/11211/sys/src/9/port/page.c:486,491 | ||
| 1990/0227 | } pg->ref--; o->npage--; | |
| 1990/0312 |
| |
| 1990/0227 | old = (PTEA*)pte; pte = pte->nextva; lock(&modalloc); | |
| 1990/1115/sys/src/9/port/page.c:653,659 – 1990/11211/sys/src/9/port/page.c:648,654 | ||
| 1990/0802 | unlock(&ptealloc); | |
| 1990/0814 | unlock(o); | |
| 1990/0802 | if(u && u->p) | |
| 1990/11211 | error(Enovmem); | |
| 1990/0802 | panic("growpte fails %d %lux %d\n", n, o->va, o->npte); | |
| 1990/0227 | } | |
| 1990/11211/sys/src/9/port/page.c:336,342 – 1990/1126/sys/src/9/port/page.c:336,342 (short | long) | ||
| 1990/0303 | o->mqid = c->mqid; | |
| 1990/0227 | incref(c); }else{ | |
| 1990/1126 | o->type = ~0; | |
| 1990/11211 | o->qid = (Qid){~0, ~0}; o->mqid = (Qid){~0, ~0}; | |
| 1990/0303 | o->mchan = 0; | |
| 1990/1126/sys/src/9/port/page.c:70,75 – 1990/1211/sys/src/9/port/page.c:70,77 (short | long) | ||
|
Created.
rsc Fri Mar 4 12:44:25 2005 | ||
| 1990/0227 | palloc.addr += BY2PG-1; palloc.addr &= ~(BY2PG-1); } | |
| 1990/1211 | if(palloc.addr >= conf.maxialloc) panic("keep bill joy away"); | |
| 1990/0227 | return (void*)(p|KZERO); } | |
| 1990/1126/sys/src/9/port/page.c:151,157 – 1990/1211/sys/src/9/port/page.c:153,162 | ||
| 1990/0227 | for(p=palloc.head; p<=palloc.tail; p++,ppn++){ p->next = p+1; p->prev = p-1; | |
| 1990/1211 | if(ppn < conf.npage0) p->pa = conf.base0+(ppn<<PGSHIFT); else p->pa = conf.base1+((ppn-conf.npage0)<<PGSHIFT); | |
| 1990/0227 | } palloc.head->prev = 0; palloc.tail->next = 0; | |
| 1990/1211/sys/src/9/port/page.c:55,61 – 1990/1212/sys/src/9/port/page.c:55,61 (short | long) | ||
| 1990/0227 | { ulong p; | |
| 1990/1212 | if(palloc.active && n!=0) | |
| 1990/0227 | print("ialloc bad\n"); if(palloc.addr == 0) palloc.addr = ((ulong)&end)&~KZERO; | |
| 1990/1211/sys/src/9/port/page.c:185,191 – 1990/1212/sys/src/9/port/page.c:185,191 | ||
| 1990/0227 | continue; } print("free %d pages va %lux %lux %c\n", o1->npage, o->va, o1->qid, devchar[o1->type]); | |
| 1990/1212 | freepage(o1, 0); | |
| 1990/0227 | /* neworig will free the orig and pte's later */ unlock(o1); if(p->ref == 0) | |
| 1990/1211/sys/src/9/port/page.c:367,373 – 1990/1212/sys/src/9/port/page.c:367,373 | ||
| 1990/0227 | unlock(o); continue; } | |
| 1990/1212 | freepage(o, 1); | |
| 1990/0227 | freepte(o); unlock(o); o->next = origalloc.free; | |
| 1990/1211/sys/src/9/port/page.c:506,512 – 1990/1212/sys/src/9/port/page.c:506,512 | ||
| 1990/0227 | close(c); } if(!(o->flag&OCACHED) || o->npage==0){ | |
| 1990/1212 | freepage(o, 1); | |
| 1990/0227 | freepte(o); unlock(o); lock(&origalloc); | |
| 1990/1211/sys/src/9/port/page.c:566,572 – 1990/1212/sys/src/9/port/page.c:566,572 | ||
| 1990/0227 | * o is locked */ void | |
| 1990/1212 | freepage(Orig *o, int dolock) | |
| 1990/0227 | { PTE *pte; Page *pg; | |
| 1990/1211/sys/src/9/port/page.c:576,582 – 1990/1212/sys/src/9/port/page.c:576,582 | ||
| 1990/0227 | for(i=0; i<o->npte; i++,pte++) if(pg = pte->page){ /* assign = */ if(pg->ref == 1){ | |
| 1990/0801 |
| |
| 1990/1212 | unusepage(pg, dolock); | |
| 1990/0227 | pte->page = 0; pg->o = 0; } | |
| 1990/1212/sys/src/9/port/page.c:341,347 – 1990/1214/sys/src/9/port/page.c:341,347 (short | long) | ||
| 1990/0303 | o->mqid = c->mqid; | |
| 1990/0227 | incref(c); }else{ | |
| 1990/1126 |
| |
| 1990/1214 | o->type = 0xFFFF; | |
| 1990/11211 | o->qid = (Qid){~0, ~0}; o->mqid = (Qid){~0, ~0}; | |
| 1990/0303 | o->mchan = 0; | |
| 1990/1214/sys/src/9/port/page.c:698,703 – 1990/1226/sys/src/9/port/page.c:698,703 (short | long) | ||
| 1990/0227 | unlock(&ptealloc); | |
| 1990/0802 | if(u && u->p) print("%s: %s: ", u->p->text, u->p->pgrp->user); | |
| 1990/1226 | print("compactpte fails addr %lux %lux %d\n", o->va+n*BY2PG, o->va, n); | |
| 1990/0802 | return 0; | |
| 1990/0227 | } | |
| 1990/1226/sys/src/9/port/page.c:85,91 – 1991/0110/sys/src/9/port/page.c:85,91 (short | long) | ||
| 1990/0303 | do;while(here); here=1; | |
| 1990/0227 | p = palloc.head; | |
| 1991/0110 | nf = nb = 0; | |
| 1990/0227 | while(p){ | |
| 1990/0303 | print("%lux %lux %d\n", p->pa, p->va, p->ref); if(p->o){ | |
| 1990/1226/sys/src/9/port/page.c:208,214 – 1991/0110/sys/src/9/port/page.c:208,214 | ||
| 1990/0227 | goto loop; out: if(p->o){ | |
| 1991/0110 | print("page in use %lux %lux %lux %lux\n", p, p->va, p->o, origalloc.arena); | |
| 1990/0227 | print("%c %lux %lux, %d %d %d\n", devchar[p->o->type], p->o->va, p->o->qid, p->o->flag, p->o->nproc, p->o->npte); panic("shit"); } | |
| 1991/0110/sys/src/9/port/page.c:464,469 – 1991/0115/sys/src/9/port/page.c:464,475 (short | long) | ||
| 1990/0227 | Page *pg; Chan *c; | |
| 1991/0115 | /* * flushvirt() is a no-op on machines without virtual write-back caches. * On such machines it is necessary to make sure the caches are flushed * before the pages are remapped. */ flushvirt(); | |
| 1990/0227 | s = u->p->seg; for(i=0; i<NSEG; i++,s++){ if(i == save) | |
| 1991/0115/sys/src/9/port/page.c:630,636 – 1991/0318/sys/src/9/port/page.c:630,636 (short | long) | ||
| 1990/0814 | goto Trouble; p = ptealloc.free; ptealloc.free += n; | |
| 1991/0318 | memmove(p+1, o->pte, o->npte*sizeof(PTE)); | |
| 1990/0814 | p->o = o; ((PTEA*)(o->pte-1))->o = 0; o->pte = p+1; | |
| 1991/0115/sys/src/9/port/page.c:689,695 – 1991/0318/sys/src/9/port/page.c:689,695 | ||
| 1990/0227 | unlock(p2o); goto Free; } | |
| 1991/0318 | memmove(p1, p2, p2->n*sizeof(PTE)); | |
| 1990/0227 | p2o->pte = p1+1; if(p2o != o) unlock(p2o); | |
| 1991/0318/sys/src/9/port/page.c:47,52 – 1991/0425/sys/src/9/port/page.c:47,54 (short | long) | ||
| 1990/0227 | PTEA *free; }modalloc; | |
| 1991/0425 | extern long end; | |
| 1990/0227 | /* * Called to allocate permanent data structures, before calling pageinit(). */ | |
| 1991/0425/sys/src/9/port/page.c:61,77 – 1991/0606/sys/src/9/port/page.c:61,75 (short | long) | ||
| 1990/0227 | print("ialloc bad\n"); if(palloc.addr == 0) palloc.addr = ((ulong)&end)&~KZERO; | |
| 1991/0606 | if(align) palloc.addr = PGROUND(palloc.addr); | |
| 1990/0227 | memset((void*)(palloc.addr|KZERO), 0, n); p = palloc.addr; palloc.addr += n; | |
| 1991/0606 | if(align) palloc.addr = PGROUND(palloc.addr); | |
| 1990/1211 | if(palloc.addr >= conf.maxialloc) panic("keep bill joy away"); | |
| 1990/0227 | return (void*)(p|KZERO); | |
| 1991/0425/sys/src/9/port/page.c:549,555 – 1991/0606/sys/src/9/port/page.c:547,553 | ||
| 1990/0227 | return 0; if(min != s->minva) /* can't grow down yet (stacks: fault.c) */ return 0; | |
| 1991/0606 | max = PGROUND(max); | |
| 1990/0227 | o = s->o; if(max == s->maxva) return 1; | |
| 1991/0425/sys/src/9/port/page.c:707,711 – 1991/0606/sys/src/9/port/page.c:705,739 | ||
| 1990/0802 | if(u && u->p) print("%s: %s: ", u->p->text, u->p->pgrp->user); | |
| 1990/1226 | print("compactpte fails addr %lux %lux %d\n", o->va+n*BY2PG, o->va, n); | |
| 1991/0606 | return 0; } long ibrk(ulong addr, int seg) { Seg *s; s = &u->p->seg[seg]; if(seg == LSEG && s->o == 0) mklockseg(s); /* Allows us to determine the base of the segment */ if(addr == 0) return s->minva; if(addr < s->endseg){ pprint("addr below segment\n"); pexit("Suicide", 0); error(Esegaddr); } if(addr > PGROUND(s->endseg)) if(segaddr(s, s->minva, addr) == 0){ pprint("bad segaddr in brk\n"); pexit("Suicide", 0); error(Esegaddr); } s->endseg = addr; | |
| 1990/0802 | return 0; | |
| 1990/0227 | } | |
| 1991/0606/sys/src/9/port/page.c:334,339 – 1991/0607/sys/src/9/port/page.c:334,340 (short | long) | ||
| 1990/0227 | o->nproc = 1; o->npage = 0; o->chan = c; | |
| 1991/0607 | o->freepg = unusepage; | |
| 1990/0227 | if(c){ o->type = c->type; o->qid = c->qid; | |
| 1991/0606/sys/src/9/port/page.c:428,435 – 1991/0607/sys/src/9/port/page.c:429,434 | ||
| 1990/0227 | ppte = 0; pte = old->mod; while(pte){ | |
| 1990/1013 | npte = newmod(o); | |
| 1990/0227 | npte->proc = p; npte->page = pte->page; | |
| 1991/0606/sys/src/9/port/page.c:579,593 – 1991/0607/sys/src/9/port/page.c:578,593 | ||
| 1990/0227 | int i; pte = o->pte; | |
| 1991/0607 | for(i=0; i<o->npte; i++,pte++) { | |
| 1990/0227 | if(pg = pte->page){ /* assign = */ if(pg->ref == 1){ | |
| 1990/1212 |
| |
| 1991/0607 | (*o->freepg)(pg, dolock); | |
| 1990/0227 | pte->page = 0; pg->o = 0; } pg->ref--; } | |
| 1991/0607 | } | |
| 1990/0227 | o->npage = 0; } | |
| Too many diffs (26 > 25). Stopping. | ||