M carrera/dat.h => carrera/dat.h +0 -1
@@ 27,7 27,6 @@ struct Lock
ulong sr;
ulong pc;
ulong pid;
- int pri;
};
struct Label
M pc/dat.h => pc/dat.h +0 -1
@@ 30,7 30,6 @@ struct Lock
ulong sr;
ulong pc;
ulong pid;
- int pri;
};
struct Label
M port/proc.c => port/proc.c +8 -14
@@ 130,21 130,11 @@ enum
void
ready(Proc *p)
{
- int s, pri, base;
+ int s, pri;
Schedq *rq;
s = splhi();
- /*
- * This interacts with code in taslock(). The intent is to keep the
- * priority of a process trying for a lock lower than the process holding
- * the lock.
- */
- if(p->lockpri)
- base = p->lockpri;
- else
- base = p->basepri;
-
/* history counts */
if(p->state == Running){
p->rt++;
@@ 154,15 144,19 @@ ready(Proc *p)
p->rt = 0;
pri = p->art/Squantum;
}
- pri = base - pri;
+ pri = p->basepri - pri;
if(pri < 0)
pri = 0;
/* the only intersection between the classes is at PriNormal */
- if(pri < PriNormal && base > PriNormal)
+ if(pri < PriNormal && p->basepri > PriNormal)
pri = PriNormal;
- p->priority = pri;
+ /* hack for livelocks due to priority */
+ if(p->lockpri)
+ pri = 0;
+
+ p->priority = pri;
rq = &runq[p->priority];
lock(runq);
M port/taslock.c => port/taslock.c +14 -42
@@ 11,59 11,41 @@ lockloop(Lock *l, ulong pc)
print("lock loop key 0x%lux pc 0x%lux held by pc 0x%lux proc %d\n",
l->key, pc, l->pc, l->pid);
dumpaproc(up);
-}
-#define LOCKLOOP 100000000 /* to detect a lock loop */
-#define SPINLOOP 10000000 /* to keep tas's off the bus */
+ /* lower priority till we get the lock */
+ if(up && up->state == Running && (getstatus()&IE)){
+ up->lockpri = 1;
+ sched();
+ }
+}
void
lock(Lock *l)
{
- int i, pri, spins;
+ int i;
ulong pc, pid;
pc = getcallerpc(l);
- if(up){
- pid = up->pid;
- pri = up->priority;
- } else {
- pid = 0;
- pri = 0;
- }
+ pid = up ? up->pid : 0;
- /* quick try, it might work */
if(tas(&l->key) == 0){
l->pc = pc;
l->pid = pid;
- l->pri = pri;
return;
}
- spins = 0;
for(;;){
i = 0;
while(l->key)
- if(i++ > SPINLOOP){
- /* look for lock loops */
- if(spins++ > LOCKLOOP/SPINLOOP){
- spins = 0;
- lockloop(l, pc);
- }
-
- /* possible priority inversion, try switching priority */
- if(up && up->state == Running)
- if(getstatus()&IE) {
-print("priority inversion\n");
- up->lockpri = l->pri;
- sched();
- }
+ if(i++ > 100000000){
+ i = 0;
+ lockloop(l, pc);
}
-
if(tas(&l->key) == 0){
l->pc = pc;
l->pid = pid;
- l->pri = pri;
- up->lockpri = 0;
+ if(up)
+ up->lockpri = 0;
return;
}
}
@@ 83,7 65,6 @@ ilock(Lock *l)
l->sr = x;
l->pc = pc;
l->pid = pid;
- l->pri = 0;
return;
}
@@ 94,7 75,6 @@ ilock(Lock *l)
l->sr = x;
l->pc = pc;
l->pid = pid;
- l->pri = 0;
return;
}
}
@@ 107,13 87,7 @@ canlock(Lock *l)
return 0;
l->pc = getcallerpc(l);
- if(up){
- l->pid = up->pid;
- l->pri = up->priority;
- } else {
- l->pid = 0;
- l->pri = 0;
- }
+ l->pid = up ? up->pid : 0;
return 1;
}
@@ 122,7 96,6 @@ unlock(Lock *l)
{
l->key = 0;
l->pc = 0;
- l->pri = 0;
}
void
@@ 133,6 106,5 @@ iunlock(Lock *l)
sr = l->sr;
l->key = 0;
l->pc = 0;
- l->pri = 0;
splx(sr);
}
M power/dat.h => power/dat.h +0 -1
@@ 26,7 26,6 @@ struct Lock
ulong pc;
ulong sr;
ulong pid;
- int pri;
};
struct Label