~kris/9p

9hist

0a6f3cd428b509bd0db26c5d211340371a3e7c02 — David du Colombier 30 years ago fb8f586
Plan 9 from Bell Labs 1995-10-30
7 files changed, 62 insertions(+), 18 deletions(-)

M carrera/dat.h
M pc/dat.h
M port/devcons.c
M port/portfns.h
M port/proc.c
M port/taslock.c
M power/dat.h
M carrera/dat.h => carrera/dat.h +1 -0
@@ 26,6 26,7 @@ struct Lock
	ulong	key;			/* semaphore (non-zero = locked) */
	ulong	sr;
	ulong	pc;
	ulong	pid;
};

struct Label

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

struct Label

M port/devcons.c => port/devcons.c +3 -0
@@ 217,6 217,9 @@ echo(Rune r, char *buf, int n)
		case 'p':
			procdump();
			return;
		case 'q':
			scheddump();
			break;
		case 'k':
			if(!cpuserver)
				killbig();

M port/portfns.h => port/portfns.h +2 -0
@@ 62,6 62,7 @@ Chan*		devopen(Chan*, int, Dirtab*, int, Devgen*);
void		devstat(Chan*, char*, Dirtab*, int, Devgen*);
int		devwalk(Chan*, char*, Dirtab*, int, Devgen*);
Chan*		domount(Chan*);
void		dumpaproc(Proc*);
void		dumpqueues(void);
void		dumpregs(Ureg*);
void		dumpstack(void);


@@ 237,6 238,7 @@ void		sccclock(void);
int		sccintr(void);
void		sccsetup(void*, ulong, int);
void		sched(void);
void		scheddump(void);
void		schedinit(void);
int		screenbits(void);
#define		scsialloc(n)	mallocz((n)+512, 0)

M port/proc.c => port/proc.c +33 -13
@@ 785,13 785,31 @@ proctab(int i)
}

void
dumpaproc(Proc *p)
{
	ulong bss;
	char *s;

	if(p == 0)
		return;

	bss = 0;
	if(p->seg[BSEG])
		bss = p->seg[BSEG]->top;

	s = p->psstate;
	if(s == 0)
		s = "kproc";
	print("%3d:%10s pc %8lux dbgpc %8lux  %8s (%s) ut %ld st %ld bss %lux\n",
		p->pid, p->text, p->pc, dbgpc(p),  s, statename[p->state],
		p->time[0], p->time[1], bss, p->priority);
}

void
procdump(void)
{
	int i;
	char *s;
	Proc *p;
	ulong bss;
	Schedq *rq;

	if(up)
		print("up %d\n", up->pid);


@@ 801,17 819,18 @@ procdump(void)
		p = &procalloc.arena[i];
		if(p->state == Dead)
			continue;
		bss = 0;
		if(p->seg[BSEG])
			bss = p->seg[BSEG]->top;

		s = p->psstate;
		if(s == 0)
			s = "kproc";
		print("%3d:%10s pc %8lux dbgpc %8lux  %8s (%s) ut %ld st %ld bss %lux\n",
			p->pid, p->text, p->pc, dbgpc(p),  s, statename[p->state],
			p->time[0], p->time[1], bss);

		dumpaproc(p);
		delay(150);
	}
}

void
scheddump(void)
{
	Proc *p;
	Schedq *rq;

	for(rq = &runq[Nrq-1]; rq >= runq; rq--){
		if(rq->head == 0)
			continue;


@@ 820,6 839,7 @@ procdump(void)
			print(" %d(%d, %d)", p->pid, m->ticks - p->readytime,
				m->ticks - p->movetime);
		print("\n");
		delay(150);
	}
	print("nrdy %d\n", nrdy);
}

M port/taslock.c => port/taslock.c +21 -5
@@ 6,26 6,38 @@
#include "../port/error.h"

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);
	dumpaproc(up);
}

void
lock(Lock *l)
{
	int i;
	ulong pc;
	ulong pc, pid;

	pc = getcallerpc(l);
	pid = up ? up->pid : 0;

	if(tas(&l->key) == 0){
		l->pc = pc;
		l->pid = pid;
		return;
	}

	for(;;){
		i = 0;
		while(l->key)
			if(i++ > 100000000)
				panic("lock loop key 0x%lux pc 0x%lux held by pc 0x%lux pl 0x%lux\n",
					l->key, pc, l->pc, splhi());
			if(i++ > 100000000){
				i = 0;
				lockloop(l, pc);
			}
		if(tas(&l->key) == 0){
			l->pc = pc;
			l->pid = pid;
			return;
		}
	}


@@ 35,14 47,16 @@ void
ilock(Lock *l)
{
	ulong x;
	ulong pc;
	ulong pc, pid;

	pc = getcallerpc(l);
	pid = up ? up->pid : 0;

	x = splhi();
	if(tas(&l->key) == 0){
		l->sr = x;
		l->pc = pc;
		l->pid = pid;
		return;
	}



@@ 52,6 66,7 @@ ilock(Lock *l)
		if(tas(&l->key) == 0){
			l->sr = x;
			l->pc = pc;
			l->pid = pid;
			return;
		}
	}


@@ 64,6 79,7 @@ canlock(Lock *l)
		return 0;

	l->pc = getcallerpc(l);
	l->pid = up ? up->pid : 0;
	return 1;
}


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

struct Label