| plan 9 kernel history: overview | file list | diff list |
1990/0802/port/page.c (diff list | history)
| 1990/0801/sys/src/9/port/page.c:4,9 – 1990/0802/sys/src/9/port/page.c:4,10 (short | long | prev | next) | ||
| 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 | } | |