From a26351d50f0e50761355ad393cfb1acd5171e714 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Tue, 10 Aug 1993 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1993-08-10 --- port/page.c | 87 +++++++++++++++++++++----------------------------- port/segment.c | 15 +++++---- 2 files changed, 45 insertions(+), 57 deletions(-) diff --git a/port/page.c b/port/page.c index e08e2dee40c78efa7d232567b68c3c99a776e085..0acebfb782e430349f1886646793f75e56eb6412 100644 --- a/port/page.c +++ b/port/page.c @@ -59,13 +59,14 @@ newpage(int clear, Segment **s, ulong va) { Page *p; KMap *k; - int hw, dontalloc; + int hw, dontalloc, fc; retry: lock(&palloc); hw = swapalloc.highwater; - while((palloc.freecount < hw && up->kp == 0) || palloc.freecount == 0) { + fc = palloc.freecount; + while((fc < hw && up->kp == 0) || fc == 0) { palloc.wanted++; unlock(&palloc); dontalloc = 0; @@ -74,9 +75,9 @@ retry: *s = 0; dontalloc = 1; } - qlock(&palloc.pwait); /* Hold memory requesters here */ + qlock(&palloc.pwait); /* Hold memory requesters here */ - while(waserror()) /* Ignore interrupts */ + while(waserror()) /* Ignore interrupts */ ; kickpager(); @@ -87,9 +88,10 @@ retry: qunlock(&palloc.pwait); /* - * If called from fault and we lost the segment from underneath - * don't waste time allocating and freeing a page. Fault will call - * newpage again when it has reacquired the segment locks + * If called from fault and we lost the segment from + * underneath don't waste time allocating and freeing + * a page. Fault will call newpage again when it has + * reacquired the segment locks */ if(dontalloc) return 0; @@ -119,7 +121,7 @@ retry: memset(p->cachectl, PG_DATINVALID, sizeof(p->cachectl)); unlock(p); - if(clear){ + if(clear) { k = kmap(p); memset((void*)VA(k), 0, BY2PG); kunmap(k); @@ -144,55 +146,40 @@ putpage(Page *p) } lock(p); - if(--p->ref == 0) { - lock(&palloc); - if(p->image && p->image != &swapimage) { - if(palloc.tail) { - p->prev = palloc.tail; - palloc.tail->next = p; - } - else { - palloc.head = p; - p->prev = 0; - } - palloc.tail = p; - p->next = 0; + if(--p->ref > 0) { + unlock(p); + return; + } + vcacheinval(p); + lock(&palloc); + if(p->image && p->image != &swapimage) { + if(palloc.tail) { + p->prev = palloc.tail; + palloc.tail->next = p; } else { - if(palloc.head) { - p->next = palloc.head; - palloc.head->prev = p; - } - else { - palloc.tail = p; - p->next = 0; - } palloc.head = p; p->prev = 0; } - - palloc.freecount++; /* Release people waiting for memory */ - unlock(&palloc); + palloc.tail = p; + p->next = 0; } - unlock(p); -} - -void -simpleputpage(Page *pg) /* Always call with palloc locked */ -{ - if(pg->ref != 1) - panic("simpleputpage"); - pg->ref = 0; - palloc.freecount++; - if(palloc.head == 0) { - palloc.head = palloc.tail = pg; - pg->prev = pg->next = 0; - return; + else { + if(palloc.head) { + p->next = palloc.head; + palloc.head->prev = p; + } + else { + palloc.tail = p; + p->next = 0; + } + palloc.head = p; + p->prev = 0; } - pg->next = palloc.head; - palloc.head->prev = pg; - pg->prev = 0; - palloc.head = pg; + + palloc.freecount++; /* Release people waiting for memory */ + unlock(&palloc); + unlock(p); } void diff --git a/port/segment.c b/port/segment.c index 652b230736631216e41fc6476ceb7a16527a38e4..d39ae9735558fb7fb03cce1256986bfebb227178 100644 --- a/port/segment.c +++ b/port/segment.c @@ -94,16 +94,17 @@ putseg(Segment *s) void relocateseg(Segment *s, ulong offset) { - Pte **p, **endpte; - Page **pg, **endpages; + Page **pg, *x; + Pte *pte, **p, **endpte; endpte = &s->map[SEGMAPSIZE]; for(p = s->map; p < endpte; p++) { - if(*p) { - endpages = &((*p)->pages[PTEPERTAB]); - for(pg = (*p)->pages; pg < endpages; pg++) - if(*pg) - (*pg)->va += offset; + if(*p == 0) + continue; + pte = *p; + for(pg = pte->first; pg <= pte->last; pg++) { + if(x = *pg) + x->va += offset; } } }