From 68733b61af6a865e9c8ae37d9fc335cdc296db93 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Thu, 4 Jun 1998 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1998-06-04 --- carrera/dat.h | 5 +++- ip/ip.c | 2 +- ip/udp.c | 2 +- pc/dat.h | 5 +++- port/portdat.h | 1 - port/proc.c | 5 ---- port/taslock.c | 68 +++++++++++++++++++++++++++++++++++--------------- 7 files changed, 58 insertions(+), 30 deletions(-) diff --git a/carrera/dat.h b/carrera/dat.h index 87a62071936d18b13af46e0f9b8f390c47a661ff..0998b88da103745be6edacbdd62cee8987e94c2d 100644 --- a/carrera/dat.h +++ b/carrera/dat.h @@ -12,6 +12,7 @@ typedef struct Notsave Notsave; typedef struct PMMU PMMU; typedef struct Softtlb Softtlb; typedef struct Ureg Ureg; +typedef struct Proc Proc; /* * parameters for sysproc.c @@ -26,7 +27,9 @@ struct Lock ulong key; /* semaphore (non-zero = locked) */ ulong sr; ulong pc; - ulong pid; + Proc *p; + ushort pri; + ushort isilock; }; struct Label diff --git a/ip/ip.c b/ip/ip.c index abb61fd4381fa2bcf70dee24c8cb30935cadfcd4..a84d08a334961b0de37645df18c08a69e42a50ba 100644 --- a/ip/ip.c +++ b/ip/ip.c @@ -182,11 +182,11 @@ ipoput(Fs *f, Block *bp, int gating, int ttl) eh->ttl = ttl; } + rlock(ifc); if(waserror()){ runlock(ifc); nexterror(); } - rlock(ifc); if(ifc->m == nil) goto raise; diff --git a/ip/udp.c b/ip/udp.c index 436349381762f21d67d545a4bb34196970501837..f284a50340605a0ccc2dcf20c41a8b213a4c4c96 100644 --- a/ip/udp.c +++ b/ip/udp.c @@ -327,7 +327,7 @@ udpiput(Proto *udp, uchar *ia, Block *bp) if(ipforme(f, laddr) == Runi) v6tov4(bp->rp+IPv4addrlen, laddr); else - memmove(bp->rp+IPv4addrlen, ia, IPv4addrlen); + v6tov4(bp->rp+IPv4addrlen, ia); hnputs(bp->rp + 2*IPv4addrlen, rport); hnputs(bp->rp + 2*IPv4addrlen + 2, lport); break; diff --git a/pc/dat.h b/pc/dat.h index a1f752dbf201b149eb1db6db761f3183b73a5c94..1e7f63fc98ae6cd43bfe67070f1b552f5a77588a 100644 --- a/pc/dat.h +++ b/pc/dat.h @@ -15,6 +15,7 @@ typedef struct Page Page; typedef struct PMMU PMMU; typedef struct Segdesc Segdesc; typedef struct Ureg Ureg; +typedef struct Proc Proc; /* * parameters for sysproc.c @@ -26,7 +27,9 @@ struct Lock ulong key; ulong sr; ulong pc; - ulong pid; + Proc *p; + ushort pri; + ushort isilock; }; struct Label diff --git a/port/portdat.h b/port/portdat.h index 1c5695638a9d37553f2d3b7754cdd0ea8648b3b1..e330947baffe4a4d79f77804ee91a8b57e411b2d 100644 --- a/port/portdat.h +++ b/port/portdat.h @@ -610,7 +610,6 @@ 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 */ int preempted; /* true if this process hasn't finished the interrupt * that last preempted it */ diff --git a/port/proc.c b/port/proc.c index 17c596d40438a13b7ec59878fe7dee41fb70e396..a0d4e49f814aa027971f17f0a34def4540854f14 100644 --- a/port/proc.c +++ b/port/proc.c @@ -157,10 +157,6 @@ ready(Proc *p) if(pri < PriNormal && p->basepri > PriNormal) pri = PriNormal; - /* hack for livelocks due to priority */ - if(p->lockpri) - pri = 0; - p->priority = pri; rq = &runq[p->priority]; @@ -327,7 +323,6 @@ newproc(void) p->wired = 0; p->ureg = 0; p->error[0] = '\0'; - p->lockpri = 0; memset(p->seg, 0, sizeof p->seg); p->pid = incref(&pidalloc); p->noteid = incref(¬eidalloc); diff --git a/port/taslock.c b/port/taslock.c index 0add04a5d10fa96b7451a9d7765cf5dcde4f761d..c50e3fe1e97fb85fe347a56bee6fb29ac577dcf4 100644 --- a/port/taslock.c +++ b/port/taslock.c @@ -9,43 +9,56 @@ void 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); + l->key, pc, l->pc, l->p ? l->p->pid : 0); dumpaproc(up); - /* lower priority till we get the lock */ - if(up && up->state == Running && islo()){ - up->lockpri = 1; + if(up && up->state == Running && islo()) sched(); - } } void lock(Lock *l) { int i; - ulong pc, pid; + ulong pc; pc = getcallerpc(l); - pid = up ? up->pid : 0; if(tas(&l->key) == 0){ l->pc = pc; - l->pid = pid; + l->p = up; + l->isilock = 0; + if(up){ + l->pri = up->priority; + up->priority = PriLock; + } return; } for(;;){ i = 0; - while(l->key) - if(i++ > 100000000){ - i = 0; - lockloop(l, pc); + while(l->key){ + if(conf.nmach < 2){ + if(i++ > 1000){ + i = 0; + lockloop(l, pc); + } + sched(); + } else { + if(i++ > 100000000){ + i = 0; + lockloop(l, pc); + } } + } if(tas(&l->key) == 0){ l->pc = pc; - l->pid = pid; - if(up) - up->lockpri = 0; + l->p = up; + l->isilock = 0; + if(up){ + l->pri = up->priority; + up->priority = PriLock; + } return; } } @@ -55,16 +68,16 @@ void ilock(Lock *l) { ulong x; - ulong pc, pid; + ulong pc; pc = getcallerpc(l); - pid = up ? up->pid : 0; x = splhi(); if(tas(&l->key) == 0){ l->sr = x; l->pc = pc; - l->pid = pid; + l->p = up; + l->isilock = 1; return; } @@ -79,7 +92,8 @@ ilock(Lock *l) if(tas(&l->key) == 0){ l->sr = x; l->pc = pc; - l->pid = pid; + l->p = up; + l->isilock = 1; return; } } @@ -92,17 +106,29 @@ canlock(Lock *l) return 0; l->pc = getcallerpc(l); - l->pid = up ? up->pid : 0; + l->p = up; + l->isilock = 0; + if(up){ + l->pri = up->priority; + up->priority = PriLock; + } return 1; } void unlock(Lock *l) { + int p; + + p = l->pri; if(l->key == 0) print("unlock: not locked: pc %uX\n", getcallerpc(l)); + if(l->isilock) + print("iunlock of lock: pc %lux, held by %lux\n", getcallerpc(l), l->pc); l->pc = 0; l->key = 0; + if(up && p < up->priority) + up->priority = p; coherence(); } @@ -113,6 +139,8 @@ iunlock(Lock *l) if(l->key == 0) print("iunlock: not locked: pc %uX\n", getcallerpc(l)); + if(!l->isilock) + print("unlock of ilock: pc %lux, held by %lux\n", getcallerpc(l), l->pc); sr = l->sr; l->pc = 0;