M port/alarm.c => port/alarm.c +12 -13
@@ 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;
M port/qlock.c => port/qlock.c +3 -0
@@ 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);
}
}
M port/segment.c => port/segment.c +17 -11
@@ 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();
M port/swap.c => port/swap.c +2 -0
@@ 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]) {
M power/fns.h => power/fns.h +1 -0
@@ 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*);
M power/l.s => power/l.s +5 -0
@@ 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
M power/lock.c => power/lock.c +5 -7
@@ 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;
}