| plan 9 kernel history: overview | file list | diff list |
1994/0602/port/segment.c (diff list | history)
| 1991/0705/sys/src/9/port/segment.c:11,16 – 1991/0706/sys/src/9/port/segment.c:11,17 (short | long) | ||
| 1991/0705 | Page *lkpage(ulong addr); Page *snewpage(ulong addr); void lkpgfree(Page*); | |
| 1991/0706 | void imagereclaim(void); | |
| 1991/0705 | /* System specific segattach devices */ #include "segment.h" | |
| 1991/0705/sys/src/9/port/segment.c:30,35 – 1991/0706/sys/src/9/port/segment.c:31,38 | ||
| 1991/0705 | Segment *free; }segalloc; | |
| 1991/0706 | static QLock ireclaim; | |
| 1991/0705 | void initseg(void) { | |
| 1991/0705/sys/src/9/port/segment.c:75,80 – 1991/0706/sys/src/9/port/segment.c:78,84 | ||
| 1991/0705 | s->flen = 0; s->pgalloc = 0; s->pgfree = 0; | |
| 1991/0706 | s->flushme = 0; | |
| 1991/0705 | memset(s->map, 0, sizeof(s->map)); return s; | |
| 1991/0705/sys/src/9/port/segment.c:135,149 – 1991/0706/sys/src/9/port/segment.c:139,160 | ||
| 1991/0705 | int i; switch(s->type&SG_TYPE) { | |
| 1991/0706 | case SG_TEXT: /* New segment shares pte set */ | |
| 1991/0705 | case SG_SHARED: case SG_PHYSICAL: incref(s); return s; | |
| 1991/0706 | case SG_BSS: /* Just copy on write */ case SG_STACK: qlock(&s->lk); | |
| 1991/0705 | n = newseg(s->type, s->base, s->size); | |
| 1991/0706 | goto copypte; | |
| 1991/0705 | ||
| 1991/0706 | case SG_DATA: /* Copy on write plus demand load info */ qlock(&s->lk); n = newseg(s->type, s->base, s->size); | |
| 1991/0705 | incref(s->image); n->image = s->image; n->fstart = s->fstart; | |
| 1991/0705/sys/src/9/port/segment.c:152,164 – 1991/0706/sys/src/9/port/segment.c:163,172 | ||
| 1991/0705 | for(i = 0; i < SEGMAPSIZE; i++) if(pte = s->map[i]) n->map[i] = ptecpy(pte); | |
| 1991/0706 | n->flushme = s->flushme; qunlock(&s->lk); | |
| 1991/0705 | return n; | |
| 1991/0705/sys/src/9/port/segment.c:188,193 – 1991/0706/sys/src/9/port/segment.c:196,202 | ||
| 1991/0705 | lock(&imagealloc); | |
| 1991/0706 | /* Search the image cache for remains of the text from a previous incarnation */ | |
| 1991/0705 | for(i = ihash(c->qid.path); i; i = i->hash) { if(c->qid.path == i->qid.path) { lock(i); | |
| 1991/0705/sys/src/9/port/segment.c:204,209 – 1991/0706/sys/src/9/port/segment.c:213,219 | ||
| 1991/0705 | while(!(i = imagealloc.free)) { unlock(&imagealloc); | |
| 1991/0706 | imagereclaim(); | |
| 1991/0705 | resrcwait("no images"); lock(&imagealloc); } | |
| 1991/0705/sys/src/9/port/segment.c:236,241 – 1991/0706/sys/src/9/port/segment.c:246,277 | ||
| 1991/0705 | } void | |
| 1991/0706 | imagereclaim(void) { Page *p; if(!canqlock(&ireclaim)) /* Somebody is already cleaning the page cache */ return; lock(&palloc); for(p = palloc.head; p; p = p->next) { if(p->image == 0) continue; unlock(&palloc); lockpage(p); if(p->ref == 0 && p->image != &swapimage) uncachepage(p); unlockpage(p); lock(&palloc); } unlock(&palloc); qunlock(&ireclaim); } void | |
| 1991/0705 | putimage(Image *i) { Image *f, **l; | |
| 1991/0705/sys/src/9/port/segment.c:271,277 – 1991/0706/sys/src/9/port/segment.c:307,313 | ||
| 1991/0705 | } long | |
| 1991/0706 | ibrk(ulong addr, int seg) | |
| 1991/0705 | { Segment *s, *ns; ulong newtop, newsize; | |
| 1991/0705/sys/src/9/port/segment.c:427,432 – 1991/0706/sys/src/9/port/segment.c:463,470 | ||
| 1991/0705 | s = seg(u->p, arg[0], 1); if(s == 0) errors("bad segment address"); | |
| 1991/0706 | s->flushme = 1; | |
| 1991/0705 | soff = arg[0]-s->base; j = (soff&(PTEMAPMEM-1))/BY2PG; | |
| 1991/0706/sys/src/9/port/segment.c:214,220 – 1991/0710/sys/src/9/port/segment.c:214,220 (short | long) | ||
| 1991/0705 | while(!(i = imagealloc.free)) { unlock(&imagealloc); | |
| 1991/0706 | imagereclaim(); | |
| 1991/0705 |
| |
| 1991/0710 | resrcwait(0); | |
| 1991/0705 | lock(&imagealloc); } | |
| 1991/0710/sys/src/9/port/segment.c:196,202 – 1991/0724/sys/src/9/port/segment.c:196,205 (short | long) | ||
| 1991/0705 | lock(&imagealloc); | |
| 1991/0706 |
| |
| 1991/0724 | /* * Search the image cache for remains of the text from a previous * or currently running incarnation */ | |
| 1991/0705 | for(i = ihash(c->qid.path); i; i = i->hash) { if(c->qid.path == i->qid.path) { lock(i); | |
| 1991/0710/sys/src/9/port/segment.c:211,216 – 1991/0724/sys/src/9/port/segment.c:214,223 | ||
| 1991/0705 | } } | |
| 1991/0724 | /* * imagereclaim dumps pages from the free list which are cached by image * structures. This should free some image structures. */ | |
| 1991/0705 | while(!(i = imagealloc.free)) { unlock(&imagealloc); | |
| 1991/0706 | imagereclaim(); | |
| 1991/0710/sys/src/9/port/segment.c:241,247 – 1991/0724/sys/src/9/port/segment.c:248,253 | ||
| 1991/0705 | else incref(i->s); | |
| 1991/0724/sys/src/9/port/segment.c:94,113 – 1991/0726/sys/src/9/port/segment.c:94,119 (short | long) | ||
| 1991/0705 | Pte **pp, **emap; Image *i; | |
| 1991/0726 | if(s == 0) return; i = s->image; if(i && i->s == s && s->ref == 1){ lock(i); if(s->ref == 1) i->s = 0; unlock(i); } if(decref(s) == 0) { if(i) putimage(i); | |
| 1991/0705 | emap = &s->map[SEGMAPSIZE]; for(pp = s->map; pp < emap; pp++) if(*pp) freepte(s, *pp); | |
| 1991/0724/sys/src/9/port/segment.c:395,404 – 1991/0726/sys/src/9/port/segment.c:401,410 | ||
| 1991/0705 | goto done; j++; } | |
| 1991/0726 | pages -= PTEPERTAB-j; j = 0; | |
| 1991/0705 | } done: flushmmu(); | |
| 1991/0726/sys/src/9/port/segment.c:442,448 – 1991/0731/sys/src/9/port/segment.c:442,448 (short | long) | ||
| 1991/0705 | errors("segments overlap"); } | |
| 1991/0731 | for(ps = physseg; ps->name; ps++) | |
| 1991/0705 | if(strcmp(name, ps->name) == 0) goto found; | |
| 1991/0731/sys/src/9/port/segment.c:438,444 – 1991/0803/sys/src/9/port/segment.c:438,445 (short | long) | ||
| 1991/0705 | ns = u->p->seg[i]; if(ns == 0) continue; | |
| 1991/0803 | if((newtop > ns->base && newtop <= ns->top) || (va >= ns->base && va < ns->top)) | |
| 1991/0705 | errors("segments overlap"); } | |
| 1991/0803/sys/src/9/port/segment.c:354,362 – 1991/0830/sys/src/9/port/segment.c:354,360 (short | long) | ||
| 1991/0705 | if(newsize > (PTEMAPMEM*SEGMAPSIZE)/BY2PG) { qunlock(&s->lk); | |
| 1991/0830 | return -1; | |
| 1991/0705 | } for(i = 0; i < NSEG; i++) { | |
| 1991/0830/sys/src/9/port/segment.c:346,352 – 1991/1005/sys/src/9/port/segment.c:346,351 (short | long) | ||
| 1991/0705 | newtop = PGROUND(addr); newsize = (newtop-s->base)/BY2PG; if(newtop < s->top) { | |
| 1991/1005/sys/src/9/port/segment.c:265,284 – 1991/1024/sys/src/9/port/segment.c:265,285 (short | long) | ||
| 1991/0706 | if(!canqlock(&ireclaim)) /* Somebody is already cleaning the page cache */ return; | |
| 1991/1024 | for(;;) { lock(&palloc); for(p = palloc.head; p; p = p->next) if(p->image && p->ref == 0 && p->image != &swapimage) break; | |
| 1991/0706 | unlock(&palloc); | |
| 1991/1024 | if(p == 0) break; | |
| 1991/0706 | lockpage(p); if(p->ref == 0 && p->image != &swapimage) uncachepage(p); unlockpage(p); | |
| 1991/1024/sys/src/9/port/segment.c:364,370 – 1991/1105/sys/src/9/port/segment.c:364,369 (short | long) | ||
| 1991/0705 | if(newtop >= ns->base && newtop < ns->top) { qunlock(&s->lk); pprint("segments overlap\n"); | |
| 1991/1105/sys/src/9/port/segment.c:106,111 – 1991/1109/sys/src/9/port/segment.c:106,112 (short | long) | ||
| 1991/0726 | } if(decref(s) == 0) { | |
| 1991/1109 | qlock(&s->lk); | |
| 1991/0726 | if(i) putimage(i); | |
| 1991/1105/sys/src/9/port/segment.c:113,118 – 1991/1109/sys/src/9/port/segment.c:114,121 | ||
| 1991/0705 | for(pp = s->map; pp < emap; pp++) if(*pp) freepte(s, *pp); | |
| 1991/1109 | qunlock(&s->lk); | |
| 1991/0705 | lock(&segalloc); s->next = segalloc.free; | |
| 1991/1109/sys/src/9/port/segment.c:418,423 – 1991/1115/sys/src/9/port/segment.c:418,424 (short | long) | ||
| 1991/0705 | ulong newtop; int i, sno; | |
| 1991/1115 | USED(p); | |
| 1991/0705 | if(va&KZERO) /* BUG: Only ok for now */ errors("bad virtual address"); | |
| 1991/1115/sys/src/9/port/segment.c:186,191 – 1991/1122/sys/src/9/port/segment.c:186,192 (short | long) | ||
| 1991/0705 | { Pte **pte; ulong off; | |
| 1991/1122 | Page **pg; | |
| 1991/0705 | if(p->va < s->base || p->va >= s->top) panic("segpage"); | |
| 1991/1115/sys/src/9/port/segment.c:195,201 – 1991/1122/sys/src/9/port/segment.c:196,207 | ||
| 1991/0705 | if(*pte == 0) *pte = ptealloc(); | |
| 1991/1122 | pg = &(*pte)->pages[(off&(PTEMAPMEM-1))/BY2PG]; *pg = p; if(pg < (*pte)->first) (*pte)->first = pg; if(pg > (*pte)->last) (*pte)->last = pg; | |
| 1991/0705 | } Image* | |
| 1991/1122/sys/src/9/port/segment.c:339,355 – 1991/1125/sys/src/9/port/segment.c:339,355 (short | long) | ||
| 1991/0705 | if(s == 0) errors("no segment"); | |
| 1991/1125 | qlock(&s->lk); | |
| 1991/0705 | if(addr < s->base) { /* We may start with the bss overlapping the data */ if(seg != BSEG || u->p->seg[DSEG] == 0 || addr < u->p->seg[DSEG]->base) { qunlock(&s->lk); | |
| 1991/1125 | errors("addr below segment"); } | |
| 1991/0705 | addr = s->base; } | |
| 1991/1125/sys/src/9/port/segment.c:6,13 – 1991/1219/sys/src/9/port/segment.c:6,11 (short | long) | ||
| 1991/0705 | #include "ureg.h" #include "errno.h" | |
| 1991/1219/sys/src/9/port/segment.c:4,10 – 1992/0111/sys/src/9/port/segment.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 | Page *lkpage(ulong addr); Page *snewpage(ulong addr); | |
| 1992/0111/sys/src/9/port/segment.c:57,63 – 1992/0114/sys/src/9/port/segment.c:57,63 (short | long) | ||
| 1991/0705 | Segment *s; if(size > (SEGMAPSIZE*PTEPERTAB)) | |
| 1992/0114 | error(Enovmem); | |
| 1991/0705 | for(;;) { lock(&segalloc); | |
| 1992/0111/sys/src/9/port/segment.c:335,341 – 1992/0114/sys/src/9/port/segment.c:335,341 | ||
| 1991/0705 | s = u->p->seg[seg]; if(s == 0) | |
| 1992/0114 | error(Ebadarg); | |
| 1991/0705 | if(addr == 0) return s->base; | |
| 1992/0111/sys/src/9/port/segment.c:346,352 – 1992/0114/sys/src/9/port/segment.c:346,352 | ||
| 1991/0705 | /* We may start with the bss overlapping the data */ if(seg != BSEG || u->p->seg[DSEG] == 0 || addr < u->p->seg[DSEG]->base) { qunlock(&s->lk); | |
| 1991/1125 |
| |
| 1992/0114 | error(Enovmem); | |
| 1991/1125 | } | |
| 1991/0705 | addr = s->base; } | |
| 1992/0111/sys/src/9/port/segment.c:371,377 – 1992/0114/sys/src/9/port/segment.c:371,377 | ||
| 1991/0705 | if(newtop >= ns->base && newtop < ns->top) { qunlock(&s->lk); pprint("segments overlap\n"); | |
| 1992/0114 | error(Enovmem); | |
| 1991/0705 | } } | |
| 1992/0111/sys/src/9/port/segment.c:424,430 – 1992/0114/sys/src/9/port/segment.c:424,430 | ||
| 1991/0705 | ||
| 1991/1115 | USED(p); | |
| 1991/0705 | if(va&KZERO) /* BUG: Only ok for now */ | |
| 1992/0114 | error(Ebadarg); | |
| 1991/0705 | validaddr((ulong)name, 1, 0); vmemchr(name, 0, ~0); | |
| 1992/0111/sys/src/9/port/segment.c:434,440 – 1992/0114/sys/src/9/port/segment.c:434,440 | ||
| 1991/0705 | break; if(sno == NSEG) | |
| 1992/0114 | error(Enovmem); | |
| 1991/0705 | va = va&~(BY2PG-1); len = PGROUND(len); | |
| 1992/0111/sys/src/9/port/segment.c:445,451 – 1992/0114/sys/src/9/port/segment.c:445,451 | ||
| 1991/0705 | continue; | |
| 1991/0803 | if((newtop > ns->base && newtop <= ns->top) || (va >= ns->base && va < ns->top)) | |
| 1991/0705 |
| |
| 1992/0114 | error(Enovmem); | |
| 1991/0705 | } | |
| 1991/0731 | for(ps = physseg; ps->name; ps++) | |
| 1992/0111/sys/src/9/port/segment.c:452,461 – 1992/0114/sys/src/9/port/segment.c:452,461 | ||
| 1991/0705 | if(strcmp(name, ps->name) == 0) goto found; | |
| 1992/0114 | error(Ebadarg); | |
| 1991/0705 | found: if(len > ps->size) | |
| 1992/0114 | error(Enovmem); | |
| 1991/0705 | attr &= ~SG_TYPE; /* Turn off what we are not allowed */ attr |= ps->attr; /* Copy in defaults */ | |
| 1992/0111/sys/src/9/port/segment.c:480,486 – 1992/0114/sys/src/9/port/segment.c:480,486 | ||
| 1991/0705 | s = seg(u->p, arg[0], 1); if(s == 0) | |
| 1992/0114 | error(Ebadarg); | |
| 1991/0706 | s->flushme = 1; | |
| 1991/0705 | ||
| 1992/0114/sys/src/9/port/segment.c:3,9 – 1992/0120/sys/src/9/port/segment.c:3,8 (short | long) | ||
| 1991/0705 | #include "mem.h" #include "dat.h" #include "fns.h" | |
| 1992/0111 | #include "../port/error.h" | |
| 1991/0705 | Page *lkpage(ulong addr); | |
| 1992/0120/sys/src/9/port/segment.c:274,280 – 1992/0225/sys/src/9/port/segment.c:274,282 (short | long) | ||
| 1991/1024 | for(;;) { lock(&palloc); for(p = palloc.head; p; p = p->next) | |
| 1992/0225 | if(p->image) if(p->ref == 0) if(p->image != &swapimage) | |
| 1991/1024 | break; | |
| 1991/0706 | unlock(&palloc); | |
| 1992/0120/sys/src/9/port/segment.c:282,288 – 1992/0225/sys/src/9/port/segment.c:284,290 | ||
| 1991/1024 | break; | |
| 1991/0706 | lockpage(p); | |
| 1992/0225 | if(p->ref == 0) | |
| 1991/0706 | uncachepage(p); unlockpage(p); } | |
| 1992/0225/sys/src/9/port/segment.c:148,153 – 1992/0307/sys/src/9/port/segment.c:148,154 (short | long) | ||
| 1991/0706 | case SG_TEXT: /* New segment shares pte set */ | |
| 1991/0705 | case SG_SHARED: case SG_PHYSICAL: | |
| 1992/0307 | case SG_SHDATA: | |
| 1991/0705 | incref(s); return s; | |
| 1991/0706 | ||
| 1992/0225/sys/src/9/port/segment.c:369,375 – 1992/0307/sys/src/9/port/segment.c:370,377 | ||
| 1991/0705 | ns = u->p->seg[i]; if(ns == 0 || ns == s) continue; | |
| 1992/0307 | if(newtop >= ns->base) if(newtop < ns->top) { | |
| 1991/0705 | qunlock(&s->lk); pprint("segments overlap\n"); | |
| 1992/0114 | error(Enovmem); | |
| 1992/0225/sys/src/9/port/segment.c:431,437 – 1992/0307/sys/src/9/port/segment.c:433,440 | ||
| 1991/0705 | vmemchr(name, 0, ~0); for(sno = 0; sno < NSEG; sno++) | |
| 1992/0307 | if(u->p->seg[sno] == 0) if(sno != ESEG) | |
| 1991/0705 | break; if(sno == NSEG) | |
| 1992/0307/sys/src/9/port/segment.c:272,277 – 1992/0310/sys/src/9/port/segment.c:272,280 (short | long) | ||
| 1991/0706 | if(!canqlock(&ireclaim)) /* Somebody is already cleaning the page cache */ return; | |
| 1992/0310 | if(conf.cntrlp) print("ireclaim %lud\n", TK2MS(MACHP(0)->ticks)); | |
| 1991/1024 | for(;;) { lock(&palloc); for(p = palloc.head; p; p = p->next) | |
| 1992/0307/sys/src/9/port/segment.c:289,294 – 1992/0310/sys/src/9/port/segment.c:292,300 | ||
| 1991/0706 | uncachepage(p); unlockpage(p); } | |
| 1992/0310 | if(conf.cntrlp) print("ireclaim done %lud\n", TK2MS(MACHP(0)->ticks)); | |
| 1991/0706 | qunlock(&ireclaim); } | |
| 1992/0310/sys/src/9/port/segment.c:95,101 – 1992/0314/sys/src/9/port/segment.c:95,103 (short | long) | ||
| 1991/0726 | return; i = s->image; | |
| 1992/0314 | if(i) if(i->s == s) if(s->ref == 1) { | |
| 1991/0726 | lock(i); if(s->ref == 1) i->s = 0; | |
| 1992/0310/sys/src/9/port/segment.c:166,171 – 1992/0314/sys/src/9/port/segment.c:168,174 | ||
| 1991/0705 | n->image = s->image; n->fstart = s->fstart; n->flen = s->flen; | |
| 1992/0314 | ||
| 1991/0705 | copypte: for(i = 0; i < SEGMAPSIZE; i++) if(pte = s->map[i]) | |
| 1992/0310/sys/src/9/port/segment.c:272,301 – 1992/0314/sys/src/9/port/segment.c:275,294 | ||
| 1991/0706 | if(!canqlock(&ireclaim)) /* Somebody is already cleaning the page cache */ return; | |
| 1992/0310 |
| |
| 1991/1024 | for(;;) { lock(&palloc); | |
| 1992/0314 | for(p = palloc.head; p; p = p->next) { | |
| 1992/0225 | if(p->image) if(p->ref == 0) | |
| 1991/1024 |
| |
| 1991/0706 | ||
| 1992/0314 | if(p->image != &swapimage) { lockpage(p); if(p->ref == 0) uncachepage(p); unlockpage(p); } } | |
| 1991/0706 | unlock(&palloc); | |
| 1991/1024 |
| |
| 1991/0706 |
| |
| 1992/0225 |
| |
| 1991/0706 |
| |
| 1992/0310 |
| |
| 1991/0706 |
| |
| 1992/0314/sys/src/9/port/segment.c:1,5 – 1992/0321/sys/src/9/port/segment.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/segment.c:275,294 – 1992/0404/sys/src/9/port/segment.c:275,292 (short | long) | ||
| 1991/0706 | if(!canqlock(&ireclaim)) /* Somebody is already cleaning the page cache */ return; | |
| 1991/1024 |
| |
| 1992/0314 |
| |
| 1992/0225 |
| |
| 1992/0404 | lock(&palloc); for(p = palloc.head; p; p = p->next) { if(p->image) if(p->ref == 0) if(p->image != &swapimage) { lockpage(p); | |
| 1992/0225 | if(p->ref == 0) | |
| 1992/0314 |
| |
| 1992/0404 | uncachepage(p); unlockpage(p); | |
| 1992/0314 | } | |
| 1991/0706 |
| |
| 1992/0404 | unlock(&palloc); | |
| 1991/0706 | qunlock(&ireclaim); } | |
| 1992/0404/sys/src/9/port/segment.c:140,146 – 1992/0430/sys/src/9/port/segment.c:140,146 (short | long) | ||
| 1991/0705 | } Segment* | |
| 1992/0430 | dupseg(Segment *s, int share) | |
| 1991/0705 | { Pte *pte; Segment *n; | |
| 1992/0404/sys/src/9/port/segment.c:154,167 – 1992/0430/sys/src/9/port/segment.c:154,183 | ||
| 1991/0705 | incref(s); return s; | |
| 1991/0706 |
| |
| 1991/0705 | n = newseg(s->type, s->base, s->size); | |
| 1991/0706 | goto copypte; | |
| 1991/0705 | ||
| 1992/0430 | case SG_BSS: /* Just copy on write */ qlock(&s->lk); if(share && s->ref == 1) { s->type = (s->type&~SG_TYPE)|SG_SHARED; incref(s); qunlock(&s->lk); return s; } n = newseg(s->type, s->base, s->size); goto copypte; | |
| 1991/0706 | case SG_DATA: /* Copy on write plus demand load info */ qlock(&s->lk); | |
| 1992/0430 | if(share && s->ref == 1) { s->type = (s->type&~SG_TYPE)|SG_SHDATA; incref(s); qunlock(&s->lk); return s; } | |
| 1991/0706 | n = newseg(s->type, s->base, s->size); | |
| 1991/0705 | incref(s->image); | |
| Too many diffs (26 > 25). Stopping. | ||