~kris/9p

9hist

7fd7a34974cdd9475f88cb4bd7b5594d214e5fe3 — David du Colombier 30 years ago 2f9960b
Plan 9 from Bell Labs 1996-05-23
5 files changed, 22 insertions(+), 59 deletions(-)

M carrera/dat.h
M pc/dat.h
M port/proc.c
M port/taslock.c
M power/dat.h
M carrera/dat.h => carrera/dat.h +0 -1
@@ 27,7 27,6 @@ struct Lock
	ulong	sr;
	ulong	pc;
	ulong	pid;
	int	pri;
};

struct Label

M pc/dat.h => pc/dat.h +0 -1
@@ 30,7 30,6 @@ struct Lock
	ulong	sr;
	ulong	pc;
	ulong	pid;
	int	pri;
};

struct Label

M port/proc.c => port/proc.c +8 -14
@@ 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);

M port/taslock.c => port/taslock.c +14 -42
@@ 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);
}

M power/dat.h => power/dat.h +0 -1
@@ 26,7 26,6 @@ struct Lock
	ulong	pc;
	ulong	sr;
	ulong	pid;
	int	pri;
};

struct Label