From 7fd7a34974cdd9475f88cb4bd7b5594d214e5fe3 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Thu, 23 May 1996 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1996-05-23 --- carrera/dat.h | 1 - pc/dat.h | 1 - port/proc.c | 22 ++++++++------------ port/taslock.c | 56 +++++++++++++------------------------------------- power/dat.h | 1 - 5 files changed, 22 insertions(+), 59 deletions(-) diff --git a/carrera/dat.h b/carrera/dat.h index d285b53735cdaa3ecec03b63f9d5d4e1479d7b2e..e4dffff10d14c50ece09aaf70e20da9462bb8885 100644 --- a/carrera/dat.h +++ b/carrera/dat.h @@ -27,7 +27,6 @@ struct Lock ulong sr; ulong pc; ulong pid; - int pri; }; struct Label diff --git a/pc/dat.h b/pc/dat.h index 22795973d5a0171b66ec0b108177a9a8bbd97fec..9d978318a6cf857cebd489e6b743b1f40ca756bc 100644 --- a/pc/dat.h +++ b/pc/dat.h @@ -30,7 +30,6 @@ struct Lock ulong sr; ulong pc; ulong pid; - int pri; }; struct Label diff --git a/port/proc.c b/port/proc.c index c0b1e1a1095987015a700544cf68a8d058ec4ded..c2331679f966346cf1e8fdc46c3c44a507ad90d4 100644 --- a/port/proc.c +++ b/port/proc.c @@ -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); diff --git a/port/taslock.c b/port/taslock.c index 789ed0859c3f19860746a8cc5851fa918131dad3..dc2b8b6836b171fdcbef2f4c77984450d3d47547 100644 --- a/port/taslock.c +++ b/port/taslock.c @@ -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); } diff --git a/power/dat.h b/power/dat.h index b70b42b8a673b8a71e9179beeebe5eb086c04905..1f00ead903a08150e38a5d8012e9b49a58708cc5 100644 --- a/power/dat.h +++ b/power/dat.h @@ -26,7 +26,6 @@ struct Lock ulong pc; ulong sr; ulong pid; - int pri; }; struct Label