M port/portdat.h => port/portdat.h +1 -0
@@ 598,6 598,7 @@ struct Proc
ulong art; /* avg # ticks used since last blocked */
ulong movetime; /* last time process switched processors */
ulong readytime; /* time process went ready */
+ ulong lockpri; /* priority of process holding lock we're trying for */
void *ureg; /* User registers for notes */
void *dbgreg; /* User registers for devproc */
M port/proc.c => port/proc.c +16 -9
@@ 130,32 130,39 @@ enum
void
ready(Proc *p)
{
- int s, pri;
+ int s, pri, base;
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){
- if(up->priority == PriLock){
- pri = 0;
- } else {
- p->rt++;
- pri = ((p->art + (p->rt<<1))>>2)/Squantum;
- }
+ p->rt++;
+ pri = ((p->art + (p->rt<<1))>>2)/Squantum;
} else {
p->art = (p->art + (p->rt<<1))>>2;
p->rt = 0;
pri = p->art/Squantum;
}
- pri = p->basepri - pri;
+ pri = base - pri;
if(pri < 0)
pri = 0;
/* the only intersection between the classes is at PriNormal */
- if(pri < PriNormal && p->basepri > PriNormal)
+ if(pri < PriNormal && base > PriNormal)
pri = PriNormal;
p->priority = pri;
+
rq = &runq[p->priority];
lock(runq);
M port/taslock.c => port/taslock.c +9 -11
@@ 25,18 25,21 @@ lock(Lock *l)
for(i=0; i<1000000; i++)
if(tas(&l->key) == 0){
l->pc = pc;
+ l->pri = 0;
return;
}
lockloop(l, pc);
return;
}
+ /* priority interacts with code in ready() in proc.c */
pri = up->priority;
- up->priority = PriLock;
for(i=0; i<1000; i++){
+ up->lockpri = l->pri; /* assume priority of process holding lock */
if(tas(&l->key) == 0){
l->pri = pri;
+ up->lockpri = 0; /* back to normal priority */
l->pc = pc;
return;
}
@@ 44,6 47,7 @@ lock(Lock *l)
sched();
}
lockloop(l, pc);
+ up->lockpri = 0; /* back to normal priority */
}
void
@@ 80,13 84,11 @@ canlock(Lock *l)
{
int pri;
- SET(pri);
- if(up) {
+ if(up)
pri = up->priority;
- up->priority = PriLock;
- }
+ else
+ pri = 0;
if(tas(&l->key)) {
- up->priority = pri;
l->pc = getcallerpc(l);
return 0;
}
@@ 97,13 99,9 @@ canlock(Lock *l)
void
unlock(Lock *l)
{
- int p;
-
- p = l->pri;
l->pc = 0;
l->key = 0;
- if(up != 0)
- up->priority = p;
+ l->pri = 0;
}
void