~kris/9p

9hist

8b57a227f50123822c311592ed997d999c2e1b85 — David du Colombier 23 years ago 8e4dc62
Plan 9 from Bell Labs 2002-12-18
3 files changed, 13 insertions(+), 15 deletions(-)

M pc/i8253.c
M pc/trap.c
M port/edf.c
M pc/i8253.c => pc/i8253.c +5 -1
@@ 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;

M pc/trap.c => pc/trap.c +3 -1
@@ 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]++;
}


M port/edf.c => port/edf.c +5 -13
@@ 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]);