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