From 90f6e3533941b1db7af8caf03641c3275d111a4f Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Fri, 26 Jul 1991 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1991-07-26 --- port/alarm.c | 25 ++++++++++++------------- port/qlock.c | 3 +++ port/segment.c | 28 +++++++++++++++++----------- port/swap.c | 2 ++ power/fns.h | 1 + power/l.s | 5 +++++ power/lock.c | 12 +++++------- 7 files changed, 45 insertions(+), 31 deletions(-) diff --git a/port/alarm.c b/port/alarm.c index 23aa3f96f57326873f2616a1cdffbfa16631ce5d..a22e465921ca5518c80d25fd77c95b59a88f08d4 100644 --- a/port/alarm.c +++ b/port/alarm.c @@ -107,20 +107,19 @@ checkalarms(void) (*f)(alist[i]); alist[i]->busy = 0; } - } else + }else unlock(&m->alarmlock); } - if(m == MACHP(0) && canqlock(&alarms)) { + if(m == MACHP(0) && canqlock(&alarms)){ now = MACHP(0)->ticks; - while((rp = alarms.head) && rp->alarm <= now) { - if(rp->alarm != 0L) { - if(canlock(&rp->debug)) { + while((rp = alarms.head) && rp->alarm <= now){ + if(rp->alarm != 0L){ + if(canlock(&rp->debug)){ postnote(rp, 0, "alarm", NUser); unlock(&rp->debug); rp->alarm = 0L; - } - else + }else break; } alarms.head = rp->palarm; @@ -137,7 +136,7 @@ procalarm(ulong time) when = MS2TK(time); old = u->p->alarm - MACHP(0)->ticks; - if(when == 0) { + if(when == 0){ u->p->alarm = 0; return TK2MS(old); } @@ -146,8 +145,8 @@ procalarm(ulong time) qlock(&alarms); l = &alarms.head; - for(f = *l; f; f = f->palarm) { - if(u->p == f) { + for(f = *l; f; f = f->palarm){ + if(u->p == f){ *l = f->palarm; break; } @@ -155,10 +154,10 @@ procalarm(ulong time) } u->p->palarm = 0; - if(alarms.head) { + if(alarms.head){ l = &alarms.head; - for(f = *l; f; f = f->palarm) { - if(f->alarm > when) { + for(f = *l; f; f = f->palarm){ + if(f->alarm > when){ u->p->palarm = f; *l = u->p; goto done; diff --git a/port/qlock.c b/port/qlock.c index 5dceace5faba4e34496d0e28f8e68b4e1b17867c..3596a991b5fc892ea2368915618347f95e766d67 100644 --- a/port/qlock.c +++ b/port/qlock.c @@ -53,7 +53,10 @@ qunlock(QLock *q) unlock(&q->queue); ready(p); }else{ + /* horrible botch because clock does a canqlock */ + int s = splhi(); unlock(&q->use); unlock(&q->queue); + splx(s); } } diff --git a/port/segment.c b/port/segment.c index d3821698de89b87601f0d19692de60959cc9a812..00f8ba08410ff9a9f7b2aae033850ecee4ba3ccb 100644 --- a/port/segment.c +++ b/port/segment.c @@ -94,20 +94,26 @@ putseg(Segment *s) Pte **pp, **emap; Image *i; - if(s && decref(s) == 0) { + 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); + emap = &s->map[SEGMAPSIZE]; for(pp = s->map; pp < emap; pp++) if(*pp) freepte(s, *pp); - if(i = s->image) { - lock(i); - if(i->s == s) - i->s = 0; - unlock(i); - putimage(i); - } - lock(&segalloc); s->next = segalloc.free; segalloc.free = s; @@ -395,10 +401,10 @@ mfreeseg(Segment *s, ulong start, int pages) goto done; j++; } - j = 0; } else - pages -= PTEMAPMEM/BY2PG; + pages -= PTEPERTAB-j; + j = 0; } done: flushmmu(); diff --git a/port/swap.c b/port/swap.c index 96d467b01a0be9a2bc387aa94769024122002af4..cda70a5817c10f10fcb54e2bb0883d4a55fe521a 100644 --- a/port/swap.c +++ b/port/swap.c @@ -114,6 +114,8 @@ pager(void *junk) sleep(&swapalloc.r, needpages, 0); + if(p->state == Dead || p->kp) + continue; if(swapimage.c) { for(i = 0; i < NSEG; i++) if(s = p->seg[i]) { diff --git a/power/fns.h b/power/fns.h index fe510987b8d97bdb258ee5e56bcc0c3f9d66074b..babdeba88325b22475a0fd7f8e24de138355680a 100644 --- a/power/fns.h +++ b/power/fns.h @@ -26,6 +26,7 @@ void flushmmu(void); void gettlb(int, ulong*); ulong gettlbvirt(int); void gotopc(ulong); +ulong getcallerpc(void); void icflush(void *, ulong); void ioboardinit(void); void intr(Ureg*); diff --git a/power/l.s b/power/l.s index bdf4e88568a20b94b89fa54314a1685837ced655..80777f92b1434f2d2d01d6b433debc55280376bc 100644 --- a/power/l.s +++ b/power/l.s @@ -146,6 +146,11 @@ TEXT gotolabel(SB), $-4 MOVW 4(R2), R29 RET +TEXT getcallerpc(SB), $0 + + MOVW (SP), R1 + RET + TEXT gotopc(SB), $8 MOVW $(64*1024), R1 diff --git a/power/lock.c b/power/lock.c index 56121e54369008cac80f0db52037e2ad1a7a197a..7c2fca8664c54e22215d41a8a323d0c464f6fd9b 100644 --- a/power/lock.c +++ b/power/lock.c @@ -103,15 +103,12 @@ lkpgfree(Page *pg) unlock(&semalloc.lock); } -#define PCOFF -9 - /* * If l->sbsem is zero, allocate a hardware semaphore first. */ void -lock(Lock *ll) +lock(Lock *l) { - Lock *l = ll; int i; ulong *sbsem; @@ -133,16 +130,16 @@ lock(Lock *ll) * Try the fast grab first */ if((*sbsem&1) == 0){ - l->pc = ((ulong*)&ll)[PCOFF]; + l->pc = getcallerpc(); return; } for(i=0; i<10000000; i++) if((*sbsem&1) == 0){ - l->pc = ((ulong*)&ll)[PCOFF]; + l->pc = getcallerpc(); return; } *sbsem = 0; - print("lock loop %lux pc %lux held by pc %lux\n", l, ((ulong*)&ll)[PCOFF], l->pc); + print("lock loop %lux pc %lux held by pc %lux\n", l, getcallerpc(), l->pc); dumpstack(); } @@ -167,6 +164,7 @@ canlock(Lock *l) } if(*sbsem & 1) return 0; + l->pc = getcallerpc(); return 1; }