From 8b57a227f50123822c311592ed997d999c2e1b85 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Wed, 18 Dec 2002 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2002-12-18 --- pc/i8253.c | 6 +++++- pc/trap.c | 4 +++- port/edf.c | 18 +++++------------- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/pc/i8253.c b/pc/i8253.c index c24fd9f3ffd64abf7cce76ecc5eb2e256488201d..8e9102e252778fb20d5a6f505b13c996a8cb689b 100644 --- a/pc/i8253.c +++ b/pc/i8253.c @@ -188,6 +188,8 @@ guesscpuhz(int aalcycles) ulong i8253periodset; int i8253dotimerset = 1; +ulong phist[128]; + void i8253timerset(uvlong next) { @@ -212,11 +214,13 @@ i8253timerset(uvlong next) /* hysteresis */ if(i8253.period != period){ +memmove(&phist[0], &phist[1], sizeof(phist)-sizeof(ulong)); +phist[nelem(phist)-1] = period; ilock(&i8253); /* load new value */ outb(Tmode, Load0|Square); outb(T0cntr, period); /* low byte */ - outb(T0cntr, period>>8); /* high byte */ + outb(T0cntr, period>>8); /* high byte */ /* remember period */ i8253.period = period; diff --git a/pc/trap.c b/pc/trap.c index 589ce50e110b9a1ca186fece5b74c5e9824a2789..c78f83e8155f3a8192afebe3f852ec00409d6a3f 100644 --- a/pc/trap.c +++ b/pc/trap.c @@ -265,8 +265,10 @@ intrtime(Mach*, int vno) m->perf.inidle -= diff; diff /= m->cpumhz; - if(diff >= Ntimevec) + if(diff >= Ntimevec){ + if (vno == 32) print("timer took %d µs\n", diff); diff = Ntimevec-1; + } intrtimes[vno][diff]++; } diff --git a/port/edf.c b/port/edf.c index ad274c87ad09020b08a0c61b58bc319a167b66cf..1f57f17e063d5cd0290e7518c107b0a1cd6d3c0b 100644 --- a/port/edf.c +++ b/port/edf.c @@ -213,8 +213,6 @@ edfreleasetimer(void) if ((t = qwaitrelease.head) == nil) return; DPRINT("edfreleasetimer clock\n"); - if (releasetimer[m->machno].when) - timerdel(&releasetimer[m->machno]); releasetimer[m->machno].when = t->r; if (releasetimer[m->machno].when <= now) releasetimer[m->machno].when = now; @@ -356,8 +354,6 @@ edfadmit(Task *t) } assert(t->runq.n > 0 || (up && up->task == t)); edfpush(t); - if (deadlinetimer[m->machno].when) - timerdel(&deadlinetimer[m->machno]); deadlinetimer[m->machno].when = t->d; timeradd(&deadlinetimer[m->machno]); }else{ @@ -478,6 +474,8 @@ edfdeadlineintr(Ureg*, Timer *timer) now = fastticks(nil); t = up->task; + + assert(t->state == EdfRunning); assert(t->scheduled > 0); used = now - t->scheduled; @@ -806,12 +804,9 @@ runt: DPRINT("%d edftimer: %T too late\n", m->machno, ticks2time(now-when)); when = now; } - if (deadlinetimer[m->machno].when){ - if(deadlinetimer[m->machno].when == when){ - iunlock(&edflock); - return p; - } - timerdel(&deadlinetimer[m->machno]); + if(deadlinetimer[m->machno].when == when){ + iunlock(&edflock); + return p; } deadlinetimer[m->machno].when = when; timeradd(&deadlinetimer[m->machno]); @@ -1081,7 +1076,6 @@ resacquire(Task *t, CSN *c) t->curcsn->S -= used; when = now + c->S; if (when < deadlinetimer[m->machno].when){ - timerdel(&deadlinetimer[m->machno]); deadlinetimer[m->machno].when = when; timeradd(&deadlinetimer[m->machno]); } @@ -1119,8 +1113,6 @@ resrelease(Task *t) t->Delta = Infinity; c->S = 0LL; /* don't allow reuse */ if(devrt) devrt(t, now, SResrel); - if (deadlinetimer[m->machno].when) - timerdel(&deadlinetimer[m->machno]); deadlinetimer[m->machno].when = when; timeradd(&deadlinetimer[m->machno]);